![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: 2 Всего: 2 |
возникла такая задача:
нужно из txt-файла размером 1 гигабайт удалить все номера абонентов, которые есть в массиве @a. (который я подгружаю из другого файла). Каждый номер состоит из 32 буквенно-цифровых символов, всего в массиве @a 500 тыс. номеров. . Получается для каждой строки нужно производить 500 тыс. поисков по шаблону. А если этих строк - несколько миллионов.. . пробовал склеить весь массив @a в общий шаблон $a="первый номер|второй номер|...|" и потом регепс s/$a//g - зависает просто. . кто сталкивался с такой задачей? |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый zyxerr, как вариант, могу предложить разбить массив на хэши помельче по нескольким первым символам номера.
Почему Вы написали про поиск по шаблону, разве у Вас не простое сравнение номеров? -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
1. Данные из файла загружайте кусками. Т.е не 1 Гб. А Где нибдуь по 1 Мб но так чтобы последний символ загружаемого куска был пробле или \n.
2. Воспользуйтесь index и substr вместо рег выраж. И у вас будет все летать. |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
хм.. продолжая идею ginnie:
а почему бы не поместить все 500 000 в один perl хэш ? а потом читать по по одному номеру из большого файла и проверять есть ли он в хеше. должно быть быстро.. если у вас не 500 000, а очень много, то возможно лучше экономить память - писать на С. если совсем много - читать Кнута про внешнюю сортировку и реализовывать нечто похожее.. |
|||
|
||||
| amg |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
По моему тоже, так и надо сделать. Такой хэш займет, по моим подсчетам, всего 63 мега оперативки. Вот примерный код:
|
||||||
|
|||||||
| zyxerr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 17.7.2008 Репутация: 2 Всего: 2 |
спасибо, я попробую и отпишусь позже
|
|||
|
||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Если не трудно напишите формат обоих файлов.
Вот как-то человеку хотел помочь, а потом выяснилось, что тема была в мусорке, собственно всё это время она там и была.
Пример получился немного длинный, но зато он никогда не убьёт оперативную помять, даже если файлы будут >= 50 Gb каждый, лишь бы хватило места на винте. ;))))) Запускать его нужно из командной строки и при запуске передать ему 2 параметра: 1. имя первого файла 2. имя второго файла Допустим мы назвали его parser.pl, значит вызываем его так: C:\>perl parser.pl ./file1.txt ./file2.txt Результат будет сохранён в файл с именем result.txt в том же каталоге, где и сам файл parser.pl Выглядеть он будет примерно так:
Правда здесь идёт подсчёт пересечений, но впринцип тот же, что и в поставленной задаче. Это сообщение отредактировал(а) korob2001 - 1.8.2008, 17:20 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |