文字列 (10 桁の数字) を別の構造体にパック/圧縮して、メモリ使用量を減らす方法が必要です。
私の目標は、数字の大きな配列 (112M のレコード) をランダム化することですが、今はメモリにロードできません (30M のレコードのみ)。したがって、データ構造のサイズを2倍に減らすことができるように、各桁を4ビットで表すことを考えています。しかし、私はもっと圧縮が必要です。
だから私はいくつかのヒントが必要です。
ありがとう。ローマン
数値が長く収まる場合は、pack 'l'
またはpack 'L'
(4 バイト) を使用できます。
それはそれほど大きなメモリ要件ではありません。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 までしか許可されません。より大きな数値をサポートするには、2 倍のメモリが必要になります。