我对很多 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/