【发布时间】:2014-05-09 22:12:13
【问题描述】:
我有一个非常大的未排序文件,1000GB 的 ID 对
- ID:ABC123 ID:ABC124
- ID:ABC123 ID:ABC124
- ID:ABC123 ID:ABA122
- ID:ABC124 ID:ABC123
- ID:ABC124 ID:ABC126
我想为文件过滤
1) 重复
example
ABC123 ABC124
ABC123 ABC124
2) 反向对(丢弃第二次出现)
example
ABC123 ABC124
ABC124 ABC123
过滤后,上面的示例文件看起来像
- ID:ABC123 ID:ABC124
- ID:ABC123 ID:ABA122
- ID:ABC124 ID:ABC126
目前,我的解决方案是这样的
my %hash;
while(my $line = <FH>){
chomp $line; #remove \n
my ($id1,$id2) = split / /, $line;
if(exists $hash{$id1$1d2} || exists $hash{$id2$id1}){
next;
}
else{
$hash{$id1$id2} = undef ; ## store it in a hash
print "$line\n";
}
}
这为较小的列表提供了所需的结果,但对于较大的列表占用了太多内存,因为我将哈希存储在内存中。
我正在寻找一种实现所需内存更少的解决方案。 我的一些想法是
1) 将哈希值保存到文件中,而不是内存中
2) 多次遍历文件
3) 使用 unix sort -u -k1,2 对文件进行排序和唯一化
在stack exchange cs上发帖后,他们提出了一种外部排序算法
【问题讨论】:
-
如果你切换前两行的ID,其中一个将与第4行重复,对吧?
-
这是一次性任务还是重复任务?如果是后者,是否有机会在创建文件时不添加重复项?
-
有多少行或相当于平均行多长? ID 长什么样?像您的示例一样,3 个字母后跟 3 个数字?您希望删除多少行? 10、1000、1% 还是 10%?它们是如何分布的?几行有很多重复?许多行有几个重复?
-
@haifzhan 如果我切换前两行的id,第2行和第4行将被删除。
-
@AndrewMorton 这是一个经常性的任务。让数据同时包含重复和重复数据删除很有用。
标签: algorithm sorting out-of-memory uniqueidentifier