On 9/25/05, Timur V. Elzhov <[EMAIL PROTECTED]> wrote: > Здравствуйте. > > Мне нужно на Perl сделать что-то вроде cat, то есть читать бинарные > данные и записывать куда-нибудь. Данных может быть очень много, > поэтому записать их все в память, а потом записать на диск не получится. > Делаю следующее: > > syswrite OUT, $str while (sysread SRC, $str, 1_000_000); > > если OUT сделать псевдонимом STDOUT и шеллом перенаправить этот STDOUT > в файл, то это работает раз в шесть-семь (!) быстрее, чем когда я явно > открываю OUT через open(). Почему? Я неправильно выбрал размер LENGTH > в sysread? Вообще, как наиболее эффективно организовать прямую передачу > данных в Perl?
Не могу ничего сказать ни про размер LENGTH, ни про Perl, но шелл скорее всего просто использует приниципиально другой алгоритм. В Вашем варианте при чтении простаивает "устройство записи", при записи - простаивает "устройство чтения". Немного более эффективный вариант мог-бы породить два потока, грубо говоря поток (1) для чтения из "устройства чтения" в буфер, сигнала на семафоре что есть данные которые можно записать, чтения данных в другой буфер, ожидания сигнала о том что данные записаны, и поток (2) для ожидания сигнала (в цикле) о том что можно писать из одного из буферов на "устройство записи". В таком варианте чтение и запись информации могут происходить одновременно, в Вашем - нет. В RAID-массивах, MP-системах и некоторых других случаях оптимальное количество потоков читающих и пишущих информацию может быть больше одного. Можно написать программу которая будет при копировании сама определять оптимальное количество таких потоков. Успехов -- Dmitry Mityugov