如何在Erlang中使用zlib压缩列表并将其解压缩?

时间:2012-01-05 12:02:52

标签: erlang zlib compression

假设我想压缩以下列表并将压缩版本保存在RAM中:

List = lists:seq(1,100000).

官方documentation中提供的示例对我不起作用 - 我收到了未绑定变量Read的错误,我不明白它的用途(是函数还是函数)变量?)。

我试图在网上搜索,但我发现的唯一一件事就是解压缩files

所以,问题是:我如何压缩列表List并在Erlang中zlib的帮助下将其解压缩?如何查看List及其压缩对应文件占用的内存量?

2 个答案:

答案 0 :(得分:9)

term_to_binary/2 BIF支持zlib压缩:


Eshell V5.8.4  (abort with ^G)
1> L = lists:seq(1,100000).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
 23,24,25,26,27,28,29|...]
2> B1 = term_to_binary(L).
<<131,108,0,1,134,160,97,1,97,2,97,3,97,4,97,5,97,6,97,7,
  97,8,97,9,97,10,97,11,97,...>>
3> size(B1).
499242
4> B2 = term_to_binary(L,[compressed]).
<<131,80,0,7,158,41,120,156,20,212,103,27,134,1,192,8,84,
  239,189,247,222,235,81,68,73,200,46,35,84,...>>
5> size(B2).
212752

binary_to_term/1将识别zlib标头并执行正确的操作。

答案 1 :(得分:3)

您可以按以下方式压缩数据:

Z=zlib:open(),
zlib:deflateInit(Z),
CData=zlib:deflate(Z2, lists:seq(1,100), finish),
zlib:deflateEnd(Z).

要解压缩您可以执行的操作:

Z=zlib:open(),
zlib:inflateInit(Z),
Data=zlib:Inflate(Z, CData),
zlib:inflateEnd(Z).

你可以通过检查CData来确定大小。