Способ упаковки строки в другую легковесную структуру - PullRequest
0 голосов
/ 29 декабря 2011

Мне нужен способ упаковать / сжать строку (10-значное число) в другую структуру, которая займет меньше памяти.

Моя цель - рандомизировать большой массив чисел (112M записей), но я не могу загрузить его в память прямо сейчас (только 30M записей). Поэтому я думаю о представлении каждой цифры через 4 бита таким образом, чтобы уменьшить размер структуры данных в два раза. Но мне нужно больше сжатия.

Так что мне нужны подсказки.

Спасибо. Roman

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Если ваши числа соответствуют длинному, вы можете использовать pack 'l' или pack 'L' (четыре байта).

0 голосов
/ 29 декабря 2011

Это не так уж и много в требовании к памяти.64-битная сборка Perl должна быть в состоянии справиться с этим.

Вы можете сэкономить память, если не используете массив чисел.Создайте цепочку из них.Это сократит накладные расходы.

$n = $a[$i];
$a[$i] = $n;

становится

$n = unpack('L', substr($s, $i*4, 4));
substr($s, $i*4, 4) = pack('L', $n);

Да, это будет медленнее.Вот экономия:

use Devel::Size qw( total_size );
my @a = (1..1000);
say total_size \@a;       # 20036
my $s = qq{\0}x(4*1000);
say total_size \$s;       #  4028

И это не считая всех накладных расходов и фрагментации системы управления памятью, используемой версией массива.

ПРИМЕЧАНИЕ. Это позволяет использовать только до 4 294 967 296.Для поддержки больших чисел потребуется вдвое больше памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...