Как мне сжать список с помощью zlib в Erlang и распаковать его обратно? - PullRequest
2 голосов
/ 05 января 2012

Допустим, я хотел бы сжать следующий список и сохранить сжатую версию в оперативной памяти:

List = lists:seq(1,100000).

Пример, приведенный в официальной документации , не работает для меня -Я получаю сообщение об ошибке для несвязанной переменной Read и не понимаю, для чего она используется (это функция или переменная?).

Я пытался выполнить поиск в Интернете, но единственное, чтоЯ обнаружил, что это связано с распаковкой файлов .

Итак, вопрос: как мне сжать список List и распаковать его обратно с помощью zlib в Erlang??Как узнать, какой объем памяти используется List и его сжатым аналогом?

Ответы [ 2 ]

9 голосов
/ 05 января 2012

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 и сделает все правильно.

3 голосов
/ 05 января 2012

Вы можете сжать данные следующим образом:

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.

...