Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Перехлес дескрипторов при работе


Автор: Suppir 23.6.2011, 13:33
Добрый день!

У меня есть директория с несколькими гигабайтами файлов *.txt.
Также есть 20 скриптов pl, которые выглядят примерно следующим образом:

Код

while(<*.txt>){
    open(IN, $_);
    while(<IN>){
        #здесь какие-то проверки
    }
    close IN;
}



Т.е. каждый скрипт открывает каждый txt на чтение, делает какие-то проверки и пишет потом в свой лог.
Сейчас я запускаю скрипты поочередно: отработает один, запущу другой и т.д. Но таким образом используется только одно ядро из 4. Не будет ли проблем с дескрипторами файлов, если я буду запускать по 4 скрипта одновременно (и, если один из них отработает, то сразу запускать следующий из очереди)? 


p.s. для многих скриптов нагрузка на процессор превышает нагрузку на винт, то есть винт работает со скоростью 150 Мб в секунду, а процессор позволяет обрабатывать только 5-10 Мб данных в секунду из-за сложных функций проверок. Поэтому хорошо бы использовать сразу все ядра. 

Автор: arto 23.6.2011, 13:34
будут.
perldoc -f flock

Автор: Suppir 23.6.2011, 13:37
Думал, может быть так сделать:


Код

while(<*.txt>){

    # создаем копию (с уникальным именем) для этого файла
    
    open(IN, "адрес копии");
    while(<IN>){
        #здесь какие-то проверки
    }
    close IN;
}




Но так получается, что эти несколько гигабайт txt будут копироваться 20 раз (по количеству скриптов). Что может только замедлить работу.

Автор: Pfailed 23.6.2011, 14:20
Если скрипты читают из этих файлов, но не пишут в них, то проблем не будет.

Автор: Suppir 23.6.2011, 14:48
Я сейчас попробовал несколько раз запустить - по очереди и сразу несколько сразу. Результат одинаковый, то есть проблем не возникает, по-видимому.

Автор: afiskon 23.6.2011, 16:38
Если открываете только на чтение, то проблем не будет. Но нагрузка на диск будет большой. И у вас в коде ошибка - close надо вызывать внутри первого цикла.

Автор: Suppir 23.6.2011, 17:01
Цитата(afiskon @  23.6.2011,  16:38 Найти цитируемый пост)
close надо вызывать внутри первого цикла. 


да, вижу, я при примера быстро написал - опечатался smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)