Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по построчному вытаскиванию из файла данных 
:(
    Опции темы
xXvladXx
Дата 3.6.2008, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 9.3.2008

Репутация: нет
Всего: 1



задача:
есть файл очень большой
с каждой строкой надо проделать сложную операцию...
так что надо делать многопоточно
но проблемка как открыть этот файл(не весь сразу(оперативы на серве оч мало))
тоесть надо построчно типа
while($line=<F1>)
разбивать на 10 файлов не удобно((
я пробовал так:
Код

use threads; 
$|=1;
open F1,"test1.txt";
for(0..9) {
@trl[$_]=threads->create(\&trp,$_); 
} 
for(@trl){
$_->join;
}
sub trp {
$n=$_;
print "<--$n-->";
while($line=<F1>){
print $n."--";
print $line;
sleep rand(3);
}
}
close F1;

файл test1:
Цитата

1
2
3
4
5
6
7
8
9


я думал что каждый поток выведет свою строку...
но вывод оказался таким
$ perl 1.pl
Цитата

<--0-->0--1
0--2
<--1--><--2--><--3--><--4--><--5--><--8--><--7--><--6--><--9-->0--3
0--4
0--5
0--6
0--7
0--8
0--9

вопрос:
как сделать чтоб каждый поток работал с определенными строками файла
тоесть
1поток 0-500
2поток 500-1000
и тд..
надо вытаскивать по строчно(не грязу сразу весь файл)
помогите плиз))
PM MAIL   Вверх
ginnie
Дата 3.6.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый xXvladXx, не могли бы Вы пояснить, почему многопоточная обработка Вашего файла будет быстрее? 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
xXvladXx
Дата 3.6.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 9.3.2008

Репутация: нет
Всего: 1



короче есть 200+к доменов надо пропарсить хуизы каждого...
в 1 поток это будет делаться неделю...
PM MAIL   Вверх
arto
Дата 3.6.2008, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



1 менеджер + N клиентов
PM MAIL ICQ   Вверх
ginnie
Дата 3.6.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



xXvladXx, если файл, о котором идет речь, содержит имена доменов, а "сложная операция" включает получение whois-информации, то ускорить можно лишь процедуру получения whois-информации, т.к. там есть ожидания ответов whois-сервера. Вся остальная обработка при распараллеливании на одном процессоре, по моему мнению, не ускорится.
Для многопоточного получения ответов от whois-сервера необходимо использовать мультиплексирование неблокирующих запросов.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
xXvladXx
Дата 3.6.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 9.3.2008

Репутация: нет
Всего: 1



так, у меня интернет не 1гигабит и пинг до хуиз серверов не 1мс
в 10 или даже в 100 потоков будет по любому быстрее
суть даже щас не в том как лучше сделать, а как правильно читать из файла 
например с 500 строки до 1000 не загружая весь файл...
PM MAIL   Вверх
ginnie
Дата 3.6.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Цитата

а как правильно читать из файла 
например с 500 строки до 1000 не загружая весь файл...


Перейти к 500 строке не зная это смещение в байтах невозможно (только последовательным чтением с начала файла).

Добавлено @ 19:22
Если очень хочется сделать в несколько потоков, используйте вариант, предложенный arto:
создайте пул потоков-обработчиков;
читайте строки из файла в основном потоке и передавайте их для обработки свободным потокам-обработчикам. 

Это сообщение отредактировал(а) ginnie - 3.6.2008, 19:23


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
xXvladXx
Дата 3.6.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 9.3.2008

Репутация: нет
Всего: 1



ну а как например сделать то что я указал в примере правильно?
ну чтоб потоки когда освобождаются будут брать следущую строку(опятьже не открывая весь файл)
PM MAIL   Вверх
tolkien
Дата 4.6.2008, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Что бы читать с 500-ой строки надо знать смещение в файле с которого начинается 500-ая строка. Если вы заранее это значение нигде не сохранили, то вам придется просматривать файл от начала до конца в ее поисках. Или сделать так чтобы записи в файле были фиксированной длины. И только одна запись на одной строке. Тогда поиск смещение будет (500 - 1) * на длину записи.
PM MAIL   Вверх
ramus
Дата 4.6.2008, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

Репутация: 1
Всего: 1



Добавлю к сообщению tolkien: если записи не фиксированной длины, то можно сначала последовательно прочитать (не через <F1>, а например командой read) весь файл и сохранить в массиве соответствие номеров строк смещению. Впоследствии командой seek Вы сможете быстро перемещаться по файлу и читать нужные Вам строки командой read (зная сколько байт надо прочитать как разницу между смещениями двух соседних строк) в разных потоках. 

И еще, если команда whois работает долго, а повторов запрашиваемых значений много, то имеет смысл запоминать в хеш полученную информацию, чтобы повторно ее не запрашивать (defined $h{$domain_name}). Правда нужно сделать этот хеш единым для всех потоков. Я бы для этого использовал базу данных.
PM MAIL   Вверх
BurnerCode
Дата 4.6.2008, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 28.2.2008
Где: Беларусь

Репутация: нет
Всего: нет



А если разбить файл ( команда split ) на несколько файлов и для каждого нового файла по потоку или fork() ?
PM MAIL   Вверх
Bulat
Дата 4.6.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(xXvladXx @  3.6.2008,  19:34 Найти цитируемый пост)
ну чтоб потоки когда освобождаются будут брать следущую строку(опятьже не открывая весь файл) 

Так, давай для начала все же разберемся с открытием файлов. Считывать что-то из файла не открывая его целиком -  smile . А то, что считывать построчно это уже совсем другое дело, дескриптор-то для файла уже открыт. В перле есть такие функции tell и seek позволяют запоминать текущую позицию в файле и сразу перемещаться на эту позицию. Т.е. ты считываешь строку, запоминаешь позицию на которой она закончилась, для следующего - переходишь на эту позицию и считываешь следующую строку. Я думаю суть ясна smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
BurnerCode
Дата 4.6.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 28.2.2008
Где: Беларусь

Репутация: нет
Всего: нет



Имхо в этой задачи геморно использовать tell и seek, т.k. они работаю с байтами а человуку нужна построчно и сюда еще нужна прикрутить потоки и файл между потоками как то поделить.

Можна еще получить кол-во строк в файле и для каждого потока отвести диапозон строк от 1 скажем до 10 и тд, эта способ альтернатива разбитию на мелкие фалы но он менее эффективен, т.k. тут будет использоваться массив.

ps: Я не понимаю почему на 10 файлов автору не удобна, после работы взять и удалить их, имхо это просто и достаточно эффективно. Я у себя ранше так делал для парсинга логов, но потом я начал использовать tell и seek, но при этом я не использовал многопоточность, мультиплексорность и многопроцессность
PM MAIL   Вверх
Bulat
Дата 4.6.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(BurnerCode @  4.6.2008,  09:51 Найти цитируемый пост)
Имхо в этой задачи геморно использовать tell и seek, т.k. они работаю с байтами а человуку нужна построчно и сюда еще нужна прикрутить потоки и файл между потоками как то поделить.

Отталкиваясь от небольшого ресурса памяти - запоминать позиции менее требовательно к памяти, нежели все остальное.


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
nitr
Дата 4.6.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Есть переменная $., есть Tie::File, есть и другие - это уже обсуждали на форуме, как открыть файл, на серверах с малыми ресурсами по памяти.
Если нужно с 500 по 1000, то можно линейным чтением, использу переменную $. .

Это сообщение отредактировал(а) nitr - 4.6.2008, 12:00


--------------------
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.