使用unordered_map删除两个大型文本文件中的重复项

Remove duplicates from two large text files using unordered_map

本文关键字:文件 文本 大型 两个 map unordered 删除 使用      更新时间:2023-10-16

我是很多C++库的新手,所以如果我的问题让人觉得幼稚,请原谅我。

我有两个大的文本文件,每个大约160 MB(每个大约70万行)。我需要从文件2中删除文件1中出现的所有重复行。为了实现这一点,我决定使用一个32个字符的字符串作为密钥的unordered_map。32个字符的字符串是每行的前32个字符(这足以唯一标识该行)。

无论如何,所以我基本上只是浏览第一个文件,并将每一行的32个字符的子字符串推送到unordered_map中。然后,我浏览第二个文件,检查文件2中的行是否存在于我的无序映射中。如果它不存在,我会将整行写入一个新的文本文件。

这适用于较小的文件。。(每个40 MB),但对于这160 MB的文件。。插入哈希表需要很长时间(甚至在我开始查看file2之前)。大约260000个插件。。它似乎已经停止或进展非常缓慢。我的记忆力有可能达到极限吗?如果是的话,有人能解释一下如何计算吗?如果没有,我还有什么可以做的吗?也许选择一个自定义的散列函数,或者指定一些有助于优化它的参数?

我在哈希表中的键对象对是(string,int),其中字符串总是32个字符长,int是我用来处理重复项的计数。我运行的是64位Windows7操作系统,内存为12 GB。

如有任何帮助,我们将不胜感激。。谢谢大家!!

您不需要映射,因为您没有任何关联数据。一个无序的集合可以完成这项工作。此外,我会选择一些内存高效的哈希集实现,比如谷歌的sparse_hash_set。它非常节省内存,并且能够将内容存储在磁盘上。

除此之外,您还可以处理较小的数据块。例如,将您的文件拆分为10个块,从每个块中删除重复项,然后将它们组合起来,直到找到一个没有重复项的块。你明白了。

我不会编写C++程序来实现这一点,而是使用一些现有的实用程序。在Linux、Unix和Cygwin中,执行以下操作:

cat将两个文件合并为一个大文件:

# cat file1 file2 > file3

使用sort -u提取唯一行:

# sort -u file3 > file4

更喜欢使用操作系统实用程序,而不是(重新)编写自己的实用程序。