我有一个可能是30+GB或更多的文件。该文件中的每一行称为一条记录,由2 个 cols组成,如下所示
id1 id2
所有这 2 个 id 都是整数(32 位)。我的工作是编写一个程序来删除所有重复记录,使记录唯一,最后将唯一的 id2 输出到文件中。
有一些限制,最多允许30G 内存,最好由非多线程/进程程序有效地完成工作。
最初我想出了一个想法:由于内存限制,我决定读取文件n次,每次只将那些记录在内存中id1 % n = i (i = 0,1,2,..,n-1)
。我使用的数据结构是 a std::map<int, std::set<int> >
,它以 id1 为 key,并将 id2 放在 id1's 中std::set
。
这样,不会违反内存约束,但速度很慢。我认为这是因为随着std::map
和std::set
变大,插入速度会下降。此外,我需要读取文件 n 次,当每一轮完成后,我必须清除std::map
下一轮的文件,这也需要一些时间。
我也尝试过hash,但它也不能让我满意,我认为即使使用300W桶也可能存在太多冲突。
所以,我在这里发布我的问题,帮助你们提供更好的数据结构或算法。
非常感谢。
附言
需要脚本(shell、python),如果它可以有效地做到这一点。