加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 大型数组上的grep或splice

发布时间:2020-12-16 06:18:27 所属栏目:大数据 来源:网络整理
导读:我有一大堆哈希值,大约0.5Gb,存储在内存中,我需要从中删除一些元素,大约10%遍布整个数组. 什么是最有效的工作,做grep,或识别需要删除的元素,并将它们拼接出去? 谢谢, 西蒙娜 解决方法 splice可以在你描述的条件下(当它移动数组内容时)转到O(n ^ 2),而grep
我有一大堆哈希值,大约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'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读