0

文字列 (10 桁の数字) を別の構造体にパック/圧縮して、メモリ使用量を減らす方法が必要です。

私の目標は、数字の大きな配列 (112M のレコード) をランダム化することですが、今はメモリにロードできません (30M のレコードのみ)。したがって、データ構造のサイズを2倍に減らすことができるように、各桁を4ビットで表すことを考えています。しかし、私はもっと圧縮が必要です。

だから私はいくつかのヒントが必要です。

ありがとう。ローマン

4

2 に答える 2

1

数値が長く収まる場合は、pack 'l'またはpack 'L'(4 バイト) を使用できます。

于 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 までしか許可されません。より大きな数値をサポートするには、2 倍のメモリが必要になります。

于 2011-12-29T18:14:20.000 に答える