use Devel::Size qw/total_size/;
our ($a, $b, $c) = ([], [], '');
for my $idx ( 0 .. 2000000 )
{
'1'; push @$a, [0.5, 0.6, 0.8];
'2'; push @$b, pack("fff", 0.5, 0.6, 0.8);
'3'; $c .= pack('f3', 0.5, 0.6, 0.8 );
}
grep { printf "%s %.2f MB\n", $_, total_size(${"$_"})/1024**2 } ('a','b','c');
=result
a 298.87 MB
b 96.69 MB
c 25.08 MB
=cut
Devel::Size 是一个外部模块,用于检测某个容器的体积。
假设有一堆三维点阵数据,需要一次载入数组,为了方便会选用二维数组,通过数组引用的形式将 [x y z] 打包起来。
但是实测中发现内存很容易就爆满,特别是最初为了方便而使用哈希 {'x'=>0.5, 'y'=>'0.6', 'z'=>'0.8'},千万个坐标点秒秒钟 out of memory。
如果改用 pack 将数据打包,以二进制而不是字符串表面形式,push @$b, pack("fff", 0.5, 0.6, 0.8); 可以将体积压缩到1/3 (针对此例)
而如果使用字符串“流”的形式进行打包 $c .= pack('f3', 0.5, 0.6, 0.8 ),可将占用缩减到原来的 1/10 不到。
内存又宽松起来了
