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

Ответить