在50GB +文本文件中查找重复行的最快方法

时间:2013-12-08 03:18:47

标签: performance sorting time-complexity large-files string-comparison

我正在尝试检查以确保我编写的加密算法是一对一的。为此,我循环完成程序并将所有输出(其中2 ^ 32个)写入文件,每行一个。在运行约9小时后,该文件的容量刚刚超过50GB。

现在我需要遍历所有输出行以验证没有重复项。以下是一些示例输出:

PAAA#0+//V8//
PAAA#o+//37//
PAAA#Q+//Z7//
ZAAA#d///#
ZAAA#J///#
ZAAA#/+//#

我知道的最简单的方法是将每一行与它后面的所有行进行比较,但那就是theta(n!)而我并不认为我可以等待那么久,因为n是2 ^ 32。

有没有办法在O(n)或O(n log n)时间内进行这种比较?我不反对将它重新输出到数据库,如果这样会更快 - 我只是想在此时节省磁盘空间。

我在Win7上用c ++编写了程序,但是我不反对在其他操作系统上使用其他语言,如果它可以更快地完成。

先谢谢你的帮助,伙计们!

1 个答案:

答案 0 :(得分:2)

为什么不在整个文件上运行快速排序,如果只需要是/否,是否存在重复,则可以在它之前/之后检查每个字符串。事实上,如果您自己编写快速排序,可以在排序时检查重复项。

或者,您可以根据字符串的第一个字符进行bucketsort,然后使用多线程并比较每个存储桶中的字符串(不同存储桶中的字符串永远不会匹配 - 它们以不同的字符开头)。

你甚至可以根据第二个字符对存储桶进行存储...然后根据第三个字符串对这些存储桶进行排序等等。当所有桶中只有一个字符串(没有重复)或者当你的多个字符串的桶包含的字符串比你更深的层数(在这种情况下,你有一个重复)。再次,使用多线程来提高速度。