使用unordered_map删除两个大型文本文件中的重复项
Remove duplicates from two large text files using unordered_map
我是很多C++库的新手,所以如果我的问题让人觉得幼稚,请原谅我。
我有两个大的文本文件,每个大约160 MB(每个大约70万行)。我需要从文件2中删除文件1中出现的所有重复行。为了实现这一点,我决定使用一个32个字符的字符串作为密钥的unordered_map。32个字符的字符串是每行的前32个字符(这足以唯一标识该行)。
无论如何,所以我基本上只是浏览第一个文件,并将每一行的32个字符的子字符串推送到unordered_map中。然后,我浏览第二个文件,检查文件2中的行是否存在于我的无序映射中。如果它不存在,我会将整行写入一个新的文本文件。
这适用于较小的文件。。(每个40 MB),但对于这160 MB的文件。。插入哈希表需要很长时间(甚至在我开始查看file2之前)。大约260000个插件。。它似乎已经停止或进展非常缓慢。我的记忆力有可能达到极限吗?如果是的话,有人能解释一下如何计算吗?如果没有,我还有什么可以做的吗?也许选择一个自定义的散列函数,或者指定一些有助于优化它的参数?
我在哈希表中的键对象对是(string,int),其中字符串总是32个字符长,int是我用来处理重复项的计数。我运行的是64位Windows7操作系统,内存为12 GB。
如有任何帮助,我们将不胜感激。。谢谢大家!!
您不需要映射,因为您没有任何关联数据。一个无序的集合可以完成这项工作。此外,我会选择一些内存高效的哈希集实现,比如谷歌的sparse_hash_set。它非常节省内存,并且能够将内容存储在磁盘上。
除此之外,您还可以处理较小的数据块。例如,将您的文件拆分为10个块,从每个块中删除重复项,然后将它们组合起来,直到找到一个没有重复项的块。你明白了。
我不会编写C++程序来实现这一点,而是使用一些现有的实用程序。在Linux、Unix和Cygwin中,执行以下操作:
cat
将两个文件合并为一个大文件:
# cat file1 file2 > file3
使用sort -u
提取唯一行:
# sort -u file3 > file4
更喜欢使用操作系统实用程序,而不是(重新)编写自己的实用程序。
- 文本文件中的单词链表
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何使用 c++ 实现并发文件/文本编辑?
- 我需要转换一些代码,以便它适用于输入和输出文件文本
- 通过套接字发送二进制文件.文本文件有效,其他文件无效
- 将大型数据文件拆分为多个小文件(文本格式)
- 如何读取输入文件(文本文件)并将输入验证为有效整数
- 从文本文件/文本流中读取Q字符串错误
- 从文本文件(文本解析器)C++中读取行和列的逻辑
- 如何将*.css文件(文本文件)的内容与附加信息存储在新文件中?
- 关于内存映射文件和使用大文件文本编辑器
- 如何在读取文件文本时跳过"n"
- 使用libzip从.zip获取文件(文本除外)