我是很多这些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操作系统。
任何帮助都将非常感谢..谢谢你们!
答案 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
更喜欢使用操作系统实用程序,而不是(重新)编写自己的实用程序。