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

标签 c++ tr1 unordered-map

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

我有两个大文本文件,每个大约 160 MB(每个大约 700000 行)。我需要从 file2 中删除 file1 中出现的所有重复行。为了实现这一目标,我决定使用 unordered_map 和 32 个字符的字符串作为我的 key 。 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 操作系统。

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

最佳答案

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

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

关于c++ - 使用 unordered_map 从两个大文本文件中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6334197/

相关文章:

JAVA:我无法从套接字读取文本,由 C++ 程序发送

c++ - std::tr1 与 visual studio 2017

c++ - hashtable,unorderd_map 迭代器使用

c++ - 如何使用具有 pair<int,int> vector 元素的 unordered_set

c++ - EvtArchiveExportedLog 失败并显示 ERROR_DIRECTORY

c++ - 如何使用 CreateFile API 打开分区?

c++ - Qt QGraphicsScene复制

c++ - 通过其他字符串索引字符串

c++ - tr1::function 可以吞下返回值吗?

c++ - 这个特定代码的时间复杂度是多少?