perl – 大型数组上的grep或splice

前端之家收集整理的这篇文章主要介绍了perl – 大型数组上的grep或splice前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一大堆哈希值,大约0.5Gb,存储在内存中,我需要从中删除一些元素,大约10%遍布整个数组.

什么是最有效的工作,做grep,或识别需要删除的元素,并将它们拼接出去?

谢谢,

西蒙娜

解决方法

splice可以在你描述的条件下(当它移动数组内容时)转到O(n ^ 2),而grep / slice将分配O(n)额外的内存(可能远小于500GB,但仍然……).

有一个没有额外内存的线性解决方案,但看起来更像C,而不像Perl:

sub inplace_grep {
    my ($code,$array) = @_; 
    # move elements backwards
    for (my ($to,$from)=(0,0); $from < @$array; $from++) {
        $code->($array->[$from]) or next;
        $array->[$to++] = $array->[$from];
    };
    # remove tail 
    splice @$array,$to; 
};

更新:关于grep内存使用情况 – 您可以通过使用大量数据并查找brk系统调用快速测试额外的内存分配.在我的系统(linux,perl 5.10)上它确实如此.

strace -e trace=brk perl -MTime::HiRes -wle \
'print "start ".time; my @array = 1..10**7; print "alloc ".time;
@array = grep { $_ %2 } @array; print "grep ".time'

猜你在找的Perl相关文章