Erlang File I / O: большие двоичные файлы и потоковая передача gzip - PullRequest
6 голосов
/ 28 сентября 2010

У меня есть два вопроса относительно ввода / вывода файла Erlang;Что лучше всего сделать в Erlang:

  1. чтение больших двоичных файлов (много гигабайт) без копирования всего файла в память
  2. чтение сжатого двоичного файла как распакованного потока1006 *

Спасибо!

Ответы [ 2 ]

5 голосов
/ 19 марта 2012

Согласно моему опыту, файл : read / 2 сам по себе будет очень медленным при частом вызове с небольшими объемами данных, несмотря на read_ahead и raw. Вы должны реализовать двоичный буфер поверх этого. Если это подразумевается под блочно-ориентированной обработкой, то я согласен.

Я говорю о времени выполнения нескольких часов (с файлом : только чтение / 2 ) против 2 минут (с буферизацией, реализованной в чистом Эрланге).

Вот мои измерения для считывания нескольких 10 байтов одновременно:

%% Bufsize vs. runtime [ns]
%% 50       169369703
%% 100      118288832
%% 1000      70187233
%% 10000     64615506
%% 100000    65087411
%% 1000000   64747497

В этом примере производительность на самом деле не увеличивается при размере буфера 10 КБ, поскольку относительные издержки для файла: чтение становится достаточно маленьким.

4 голосов
/ 28 сентября 2010
  1. См. file:read/2 для последовательного доступа к блоку и file:pread/2,3 для произвольного доступа.
  2. См. Параметр compressed в file:open/2.
...