【发布时间】:2012-04-06 15:43:53
【问题描述】:
我必须从非常大的文本文件 (100 Gb+) 中删除重复的字符串
由于数据量大,内存中的重复删除是没有希望的,我尝试了bloomfilter,但除了5000万个字符串之外没有用..
总字符串大约 1 万亿个以上
我想知道有什么方法可以解决这个问题..
我最初的尝试是将文件分成多个子文件,对每个文件进行排序,然后将所有文件合并在一起......
如果您有比这更好的解决方案,请告诉我,
谢谢..
【问题讨论】:
-
你在正确的轨道上;基于磁盘的合并排序会为您完成。之后,它只是通过文件的单次传递。
-
可能所有 CS 学生第一年都会学习一些花哨的算法,但如果我不得不考虑很长时间,我可能会说考虑实现基于磁盘的哈希集之类的东西。为有意义的桶数选择一个值,称之为 n。创建 n 个文件。获取每个字符串的哈希码,并取该值 %n(调用结果 m)查看它属于哪个存储桶。然后检查m对应的文件,看里面是否存在字符串。如果没有,请添加它。移动到下一个字符串。完成此过程后,您可以合并文件。
-
基本思想是忘记排序。只需创建大量的桶,越大越好,然后扫描桶。
-
我既不是硬件人,也没有CS背景。就像我说的那样,我完全希望任何真正了解这两者的人都会嘲笑我的建议。幸运的是,我不必在日常工作中删除 100GB 文件中的重复字符串。
-
其他好奇,多长时间能找到重复项?是经常发生,还是只是一些奇怪的案例,还是真的不为人知?我有一个较小的案例(约 10 个 Go 文件),结果发现大多数相同的消息都聚集在一起,大部分是预先排序的。找到独特的很容易,只需查看下一行,看看是否相同。最后,少数罕见的重复并不重要。
标签: c# string duplicates