Erlang文件I/O:大型二进制文件和gzip流

Erl*_*ang 6 erlang file-io gzip file

我有两个关于Erlang文件i/o的问题; 在Erlang中实现的最佳方法是什么:

  1. 读取大型二进制文件(许多千兆字节)而不将整个文件复制到内存中
  2. 将gzip压缩文件作为解压缩流读取

谢谢!

Hyn*_*dil 5

  1. file:read/2参阅顺序块访问和file:pread/2,3随机访问。
  2. 请参阅compressed中的选项file:open/2


tzp*_*tzp 5

根据我的经验,文件:如果使用少量数据频繁调用文件:read/2非常慢,尽管read_aheadraw.您必须在其上实现二进制缓冲区.如果这是面向块处理的意思,那么我同意.

我说的是几个小时的运行时间(文件:只读/ 2)与2分钟(在纯Erlang中实现缓冲).

以下是我一次读取10个字节的测量结果:

%% Bufsize vs. runtime [ns]
%% 50       169369703
%% 100      118288832
%% 1000      70187233
%% 10000     64615506
%% 100000    65087411
%% 1000000   64747497
Run Code Online (Sandbox Code Playgroud)

在此示例中,性能并未真正增加超过10 KB的缓冲区大小,因为file:read的相对开销变得足够小.