![]() |
|
Модераторы: ginnie, korob2001 |
![]()
|
|
| Trikselion |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 14.6.2011 Репутация: нет Всего: нет |
Сломал мозг. Обращаюсь к коллективному разуму =) Помогите советом.
Давно не програмил на перле, а тут надо решить именно на нем такую задачку. Условие задачи таково: Обработка файла 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% или более. Как итог Ваших изменений, Ваша программа должна стать легче читаемой и более быстрой. Ну, насчет стрикт - это мне ясно. Насчет валидности адресов не совсем понятно... А как еще определить что это емейл, кроме как проверить на валидность? А вдруг просто случайное совпадение... К тому же у меня на проверке еще завязано создание файлов. А насчет производительности совсем не ясно... СОС =) Это сообщение отредактировал(а) Trikselion - 14.6.2011, 20:05 |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
||||
|
||||
| afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: нет Всего: 4 |
Похоже на тестовое задание, которое нужно выполнить, чтобы попасть на собеседование. Угадал?
Если я правильно понял задание, вам нужно что-то вроде этого:
Как один из способов распараллеливания, можно использовать скрипт из этой заметки (см пункт 2). Только его нужно будет немного переписать. И желательно замерить скорость, чтобы точно сказать - поможет распараллеливание или нет. Еще один способ ускорить скрипт - использовать вместо регулярных выражений функции типа strstr. |
|||
|
||||
| Trikselion |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 14.6.2011 Репутация: нет Всего: нет |
gcc: хм... хотя мне не совсем ясно, что они имели в виду под сторонними модулями.
afiskon: Учебное задание )) Тоесть получается, что здесь возможный прирост скорости будет достигаться за счет создания отдельных процессов? Ушел разбираться =) кстати, использовать вместо регексов субстр это хорошая тема. И как я про нее забыл... Привык к регексам =) Всем спасибо! Ушел думать ) |
|||
|
||||
| afiskon |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: нет Всего: 4 |
хз, эксперементировать нужно. Но как минимум, если выходные файлы лежат на отдельных винтах или в tmpfs, то прирост будет 100 пудово - иначе не факт.
Да вообще непонятно, кому нужны эти 100500 функций для работы со строками, когда есть =~ ;) |
||||
|
|||||
| loginn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 22.12.2010 Репутация: нет Всего: нет |
Как говорится, дешево и сердито:
Это сообщение отредактировал(а) loginn - 28.8.2011, 21:39 |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 1 Всего: 40 |
perl -MIO::File -nle 'BEGIN{ $/ = "From " } m#(\S+)# or next; $io{$1} ||= new IO::File "> $1"; $io{$1}->print("From: $_")'
|
|||
|
||||
| Pilat66 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 27.1.2009 Репутация: нет Всего: 1 |
Одно замечание.. Реальный unix mailbox ни одна из предложенных программ не прочитает.
|
|||
|
||||
![]()
|
| Правила форума "Perl: Системное программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |