| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > Работа с очень большими файлами. Поиск информации. |
| Автор: Trikselion 14.6.2011, 20:00 | ||
| Сломал мозг. Обращаюсь к коллективному разуму =) Помогите советом. Давно не програмил на перле, а тут надо решить именно на нем такую задачку. Условие задачи таково: Обработка файла unix.mailbox. Письма идут подряд в одном файле в текстовом формате, длина строк не превышает 1000 байт. Надо рассортировать письма по отправителям и разбить по файлам что б каждый файл - отдельный отправитель в таком же формате. Признак начала письма - строка, начинающаяся на слово From , сразу за которым следует 1 пробел, сразу за которым следует e-mail отправителя, сразу за которым следует пробел и какая-то дополнительная информация. Писем очень много, некоторые из них могут иметь большой объем. Объем входного файла может составлять много гигабайт. С другой стороны, кол-во разных отправителей не превышает 100. Есть ряд требований: 1) объем RAM ограничен, поэтому не нужно хранить в памяти "лишних" структур и данных, без которых можно обойтись; 2) каждый файл должен открываться/закрываться только 1 раз; 3) нельзя использовать сторонние модули; 4) решение ожидается в виде одного относительно короткого файла (не более примерно 50 строк на Perl). Не нужно усложнять решение каким-то дополнительным функционалом, проверками данных и т. п. Я написал вот такую программу:
На что мне ответили вот что: 1) use strict; -- с этого начинается любая программа на Perl; 2) мы не просили валидировать адреса e-mail; 3) уберите из программы всё лишнее: лишние переменные и действия, которые не обязательны для решения задачи; 4) новая версия Вашей программы должна работать на тех же данных (для большого файла) значительно (на десятки процентов) быстрее старой. Конкретный прирост производительности, конечно, будет зависеть от входных данных и аппаратного обеспечения, но навскидку мы ожидаем рост скорости в 50..70% или более. Как итог Ваших изменений, Ваша программа должна стать легче читаемой и более быстрой. Ну, насчет стрикт - это мне ясно. Насчет валидности адресов не совсем понятно... А как еще определить что это емейл, кроме как проверить на валидность? А вдруг просто случайное совпадение... К тому же у меня на проверке еще завязано создание файлов. А насчет производительности совсем не ясно... СОС =) |
| Автор: gcc 14.6.2011, 22:08 |
| может быть подойдет File::SortedSeek http://search.cpan.org/~jfreeman/File-SortedSeek-0.015/lib/File/SortedSeek.pm |
| Автор: afiskon 15.6.2011, 06:31 | ||
| Похоже на тестовое задание, которое нужно выполнить, чтобы попасть на собеседование. Угадал? Если я правильно понял задание, вам нужно что-то вроде этого:
Как один из способов распараллеливания, можно использовать скрипт http://eax.me/web-spider/ (см пункт 2). Только его нужно будет немного переписать. И желательно замерить скорость, чтобы точно сказать - поможет распараллеливание или нет. Еще один способ ускорить скрипт - использовать вместо регулярных выражений функции типа strstr. |
| Автор: Trikselion 15.6.2011, 15:50 |
| gcc: хм... хотя мне не совсем ясно, что они имели в виду под сторонними модулями. afiskon: Учебное задание )) Тоесть получается, что здесь возможный прирост скорости будет достигаться за счет создания отдельных процессов? Ушел разбираться =) кстати, использовать вместо регексов субстр это хорошая тема. И как я про нее забыл... Привык к регексам =) Всем спасибо! Ушел думать ) |
| Автор: afiskon 15.6.2011, 16:44 | ||||
хз, эксперементировать нужно. Но как минимум, если выходные файлы лежат на отдельных винтах или в tmpfs, то прирост будет 100 пудово - иначе не факт.
Да вообще непонятно, кому нужны эти 100500 функций для работы со строками, когда есть =~ ;) |
| Автор: loginn 28.8.2011, 21:35 | ||
Как говорится, дешево и сердито:
|
| Автор: arto 30.8.2011, 09:56 |
| perl -MIO::File -nle 'BEGIN{ $/ = "From " } m#(\S+)# or next; $io{$1} ||= new IO::File "> $1"; $io{$1}->print("From: $_")' |
| Автор: Pilat66 21.9.2011, 19:32 |
| Одно замечание.. Реальный unix mailbox ни одна из предложенных программ не прочитает. |