![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| xXvladXx |
|
||||||
|
Бездарь ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 9.3.2008 Репутация: нет Всего: 1 |
задача:
есть файл очень большой с каждой строкой надо проделать сложную операцию... так что надо делать многопоточно но проблемка как открыть этот файл(не весь сразу(оперативы на серве оч мало)) тоесть надо построчно типа while($line=<F1>) разбивать на 10 файлов не удобно(( я пробовал так:
файл test1:
я думал что каждый поток выведет свою строку... но вывод оказался таким $ perl 1.pl
вопрос: как сделать чтоб каждый поток работал с определенными строками файла тоесть 1поток 0-500 2поток 500-1000 и тд.. надо вытаскивать по строчно(не грязу сразу весь файл) помогите плиз)) |
||||||
|
|||||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый xXvladXx, не могли бы Вы пояснить, почему многопоточная обработка Вашего файла будет быстрее?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| xXvladXx |
|
|||
|
Бездарь ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 9.3.2008 Репутация: нет Всего: 1 |
короче есть 200+к доменов надо пропарсить хуизы каждого...
в 1 поток это будет делаться неделю... |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
1 менеджер + N клиентов
|
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
xXvladXx, если файл, о котором идет речь, содержит имена доменов, а "сложная операция" включает получение whois-информации, то ускорить можно лишь процедуру получения whois-информации, т.к. там есть ожидания ответов whois-сервера. Вся остальная обработка при распараллеливании на одном процессоре, по моему мнению, не ускорится.
Для многопоточного получения ответов от whois-сервера необходимо использовать мультиплексирование неблокирующих запросов. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| xXvladXx |
|
|||
|
Бездарь ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 9.3.2008 Репутация: нет Всего: 1 |
так, у меня интернет не 1гигабит и пинг до хуиз серверов не 1мс
в 10 или даже в 100 потоков будет по любому быстрее суть даже щас не в том как лучше сделать, а как правильно читать из файла например с 500 строки до 1000 не загружая весь файл... |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Перейти к 500 строке не зная это смещение в байтах невозможно (только последовательным чтением с начала файла). Добавлено @ 19:22 Если очень хочется сделать в несколько потоков, используйте вариант, предложенный arto: создайте пул потоков-обработчиков; читайте строки из файла в основном потоке и передавайте их для обработки свободным потокам-обработчикам. Это сообщение отредактировал(а) ginnie - 3.6.2008, 19:23 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| xXvladXx |
|
|||
|
Бездарь ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 9.3.2008 Репутация: нет Всего: 1 |
ну а как например сделать то что я указал в примере правильно?
ну чтоб потоки когда освобождаются будут брать следущую строку(опятьже не открывая весь файл) |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Что бы читать с 500-ой строки надо знать смещение в файле с которого начинается 500-ая строка. Если вы заранее это значение нигде не сохранили, то вам придется просматривать файл от начала до конца в ее поисках. Или сделать так чтобы записи в файле были фиксированной длины. И только одна запись на одной строке. Тогда поиск смещение будет (500 - 1) * на длину записи.
|
|||
|
||||
| ramus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 21.2.2008 Репутация: 1 Всего: 1 |
Добавлю к сообщению tolkien: если записи не фиксированной длины, то можно сначала последовательно прочитать (не через <F1>, а например командой read) весь файл и сохранить в массиве соответствие номеров строк смещению. Впоследствии командой seek Вы сможете быстро перемещаться по файлу и читать нужные Вам строки командой read (зная сколько байт надо прочитать как разницу между смещениями двух соседних строк) в разных потоках.
И еще, если команда whois работает долго, а повторов запрашиваемых значений много, то имеет смысл запоминать в хеш полученную информацию, чтобы повторно ее не запрашивать (defined $h{$domain_name}). Правда нужно сделать этот хеш единым для всех потоков. Я бы для этого использовал базу данных. |
|||
|
||||
| BurnerCode |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 28.2.2008 Где: Беларусь Репутация: нет Всего: нет |
А если разбить файл ( команда split ) на несколько файлов и для каждого нового файла по потоку или fork() ?
|
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Так, давай для начала все же разберемся с открытием файлов. Считывать что-то из файла не открывая его целиком - -------------------- менеджер по кодеврайтингу |
|||
|
||||
| BurnerCode |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 28.2.2008 Где: Беларусь Репутация: нет Всего: нет |
Имхо в этой задачи геморно использовать tell и seek, т.k. они работаю с байтами а человуку нужна построчно и сюда еще нужна прикрутить потоки и файл между потоками как то поделить.
Можна еще получить кол-во строк в файле и для каждого потока отвести диапозон строк от 1 скажем до 10 и тд, эта способ альтернатива разбитию на мелкие фалы но он менее эффективен, т.k. тут будет использоваться массив. ps: Я не понимаю почему на 10 файлов автору не удобна, после работы взять и удалить их, имхо это просто и достаточно эффективно. Я у себя ранше так делал для парсинга логов, но потом я начал использовать tell и seek, но при этом я не использовал многопоточность, мультиплексорность и многопроцессность |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Отталкиваясь от небольшого ресурса памяти - запоминать позиции менее требовательно к памяти, нежели все остальное. -------------------- менеджер по кодеврайтингу |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Есть переменная $., есть Tie::File, есть и другие - это уже обсуждали на форуме, как открыть файл, на серверах с малыми ресурсами по памяти.
Если нужно с 500 по 1000, то можно линейным чтением, использу переменную $. . Это сообщение отредактировал(а) nitr - 4.6.2008, 12:00 |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |