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

时间:2011-06-13 17:55:53

标签: c++ tr1 unordered-map

我是很多这些C ++库的新手,所以如果我的问题很天真,请原谅我。

我有两个大文本文件,每个大约160 MB(每个大约700,000行)。我需要从file2中删除file1中出现的所有重复行。为此,我决定使用带有32个字符串的unordered_map作为我的密钥。 32个字符串是每行的前32个字符(这足以唯一地标识该行)。

无论如何,所以我基本上只是浏览第一个文件并将每行的32个char子串推入unordered_map。然后我浏览第二个文件,检查我的unordered_map中是否存在file2中的行。如果它不存在,我将整行写入新的文本文件。

这适用于较小的文件..(每个40 MB),但对于这160 MB的文件..插入哈希表需要很长时间(在我开始查看file2之前)。在大约260,000个插入物......它似乎已经停止或变得非常缓慢。我有可能达到我的记忆限制吗?如果是这样,有人可以解释如何计算吗?如果没有,我还能做些什么来加快速度吗?也许选择一个自定义哈希函数,或指定一些有助于优化它的参数?

我在哈希表中的关键对象是(string,int),其中字符串总是32个字符长,而int是我用来处理重复项的计数。 我正在运行带有12 GB RAM的64位Windows 7操作系统。

任何帮助都将非常感谢..谢谢你们!

2 个答案:

答案 0 :(得分:3)

您不需要地图,因为您没有任何关联数据。一个无序的集合将完成这项工作。另外,我会使用像Google sparse_hash_set这样的内存高效哈希集实现。它非常节省内存,并且能够将内容存储在磁盘上。

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

答案 1 :(得分:0)

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

cat将两个文件分成1个大文件:

# cat file1 file2 > file3

使用sort -u提取唯一的行:

# sort -u file3 > file4

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