2

我对很多这些 C++ 库都很陌生,所以如果我的问题显得幼稚,请原谅我。

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

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

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

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

任何帮助将不胜感激..谢谢大家!

4

2 回答 2

3

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

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

于 2011-06-13T18:04:04.503 回答
0

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

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

# cat file1 file2 > file3

用于sort -u提取唯一行:

# sort -u file3 > file4

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

于 2011-06-13T18:45:06.620 回答