Re: Perl: эффективная буферизация

2005-09-26 Пенетрантность Artem Chuprina
Alexandra N. Kossovsky - debian-russian@lists.debian.org  @ Mon, 26 Sep 2005 
09:56:58 +0400:

 ANK Я вообще-то подозреваю, что sysread/syswrite -- это интерфейс к read(2)
 ANK  write(2).

Именно так.

 ANK Почти никакой буферизации при этом нет (буферизация может быть на
 ANK уровне ядра, но пользователю это обычно неинтересно).  fsync(3)
 ANK имеет смысл только для потоков полученных fopen(3).

А вот не надо.  Тогда бы он FILE* получал.  И он, заметим, (2), а не
(3).  Что характерно.

-- 
Artem Chuprina
RFC2822: ran{}ran.pp.ru Jabber: [EMAIL PROTECTED]

Психология - это наука о плохих контактах (С)энта


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: Perl: эффективная буферизация

2005-09-25 Пенетрантность Dmitry Mityugov
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


Re: Perl: эффективная буферизация

2005-09-25 Пенетрантность Artem Chuprina
Timur V. Elzhov - debian-russian@lists.debian.org  @ Sun, 25 Sep 2005 20:28:04 
+0400:

 TVE Мне нужно на Perl сделать что-то вроде cat, то есть читать бинарные
 TVE данные и записывать куда-нибудь. Данных может быть очень много,
 TVE поэтому записать их все в память, а потом записать на диск не получится.
 TVE Делаю следующее:

 TVE syswrite OUT, $str  while (sysread SRC, $str, 1_000_000);

 TVE если OUT сделать псевдонимом STDOUT и шеллом перенаправить этот STDOUT
 TVE в файл, то это работает раз в шесть-семь (!) быстрее, чем когда я явно
 TVE открываю OUT через open(). Почему? Я неправильно выбрал размер LENGTH
 TVE в sysread? Вообще, как наиболее эффективно организовать прямую передачу
 TVE данных в Perl?

 TVE Спасибо.

Вообще-то буферизованный вывод в perl делается через read/print, а не
через sysread/syswrite.  Но вот насчет в частности неочевидно.  Разве
что после каждого syswrite делается fsync?  Да вроде не
должно...  Может, конечно, артефакт того, что открывается через open()
(для sys* надо и открывать через sysopen), но такая возможность тоже
больше похожа на чисто теоретическую, а проверять лениво.

-- 
Artem Chuprina
RFC2822: ran{}ran.pp.ru Jabber: [EMAIL PROTECTED]

Все учтено могучим ураганом...


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]