0

我需要一种将字符串(10 位数字)打包/压缩到另一个结构中的方法,这将占用更少的内存。

我的目标是随机化一大堆数字(112M 的记录),但我现在无法将它加载到内存中(只有 30M 的记录)。所以我考虑通过 4 位来表示每个数字,这样我可以将数据结构的大小减少两倍。但我需要更多的压缩。

所以我需要一些提示。

谢谢。罗马

4

2 回答 2

1

如果您的数字很长,您可以使用pack 'l'pack 'L'(四个字节)。

于 2011-12-29T10:19:39.627 回答
0

这并不是一个巨大的内存需求。Perl 的 64 位版本应该能够处理它。

如果您避免使用数字数组,则可以节省内存。创建一个字符串。这将减少开销。

$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。支持更高的数字将需要两倍的内存。

于 2011-12-29T18:14:20.000 回答