【问题标题】:Fastest way to find duplicate lines in 50GB+ text file在 50GB+ 文本文件中查找重复行的最快方法
【发布时间】:2013-12-08 03:18:47
【问题描述】:

我正在尝试检查以确保我编写的加密算法是一对一的。为此,我遍历程序并将所有输出(其中 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++ 编写了程序,但如果可以更快地完成,我不反对在其他操作系统上使用其他语言。

提前感谢各位的帮助!

【问题讨论】:

  • 当前存在的行是否有任何顺序? (基于原始程序如何编写文件)
  • 不,目前没有排序顺序。我的算法的输入已排序,但输出未排序。
  • 为什么不重新读取所有内容并将所有以'a'开头的行推入名为bucket.a的文件中,所有以'b'开头的行推入bucket.b,等等向前?然后,您只需要检查 bucket 文件中的重复项,这些文件可能大约是 1/256 大。 (实际上,您可以对每个存储桶再次执行此过程以获得更小的块。)
  • 是的,这就是我在阅读 nhgrif 的回答后的想法。这似乎是最合理的解决方案。

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


【解决方案1】:

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

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

您甚至可以根据第二个字符对桶排序...然后根据第三个字符对这些桶进行桶排序,依此类推,一直向下。当所有存储桶中只有 1 个字符串(无重复)或当您的具有多个字符串的存储桶包含的字符串短于您所在的级别数时(在这种情况下,您有复制)。同样,使用多线程来提高速度。

【讨论】:

  • 我真的不知道如何对文件进行排序 - 我对文件 IO 的东西不太熟悉。不过我会调查一下,谢谢!
  • 我不知道您打算如何在不熟悉文件 IO 的情况下检查文件的重复项...
  • 我对此有所了解——标准读写等等。我只是不熟悉将文本插入特定位置之类的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多