Re: Perl: эффективная буферизация
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: эффективная буферизация
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: эффективная буферизация
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]