我有两个大文件(每个 6GB)。它们未排序,以换行符 ( \n
) 作为分隔符。我怎样才能区分它们?应该需要 24 小时以内。
答案1
最明显的答案就是使用 diff 命令,并且向其中添加 --speed-large-files 参数可能是一个好主意。
diff --speed-large-files a.file b.file
您提到未排序的文件,所以也许您需要先对文件进行排序
sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted
您可以通过将第二排序输出直接传递到 diff 来保存创建额外的输出文件
sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -
显然,这些在具有大量可用内存的系统上运行得最好,并且您可能也需要大量的可用磁盘空间。
从你的问题中并不清楚你以前是否尝试过这些。如果是这样,那么了解出了什么问题(花费了太长时间等)将会很有帮助。我一直发现,库存排序和 diff 命令往往至少与自定义命令一样好,除非文件有一些非常特定于域的属性,使得可以以不同的方式执行操作。
答案2
对输入进行排序并告诉diff
程序输入已排序将提供巨大的加速。我不知道有diff
类似的选项,但comm
假设输入已排序,如果它足够满足您的目的,速度会快得多。
答案3
该bdiff
工具可以处理比计算机 RAM 大得多的未排序文件。
bdiff
使用这些步骤一次,在第一次使用之前下载并编译:
wget https://github.com/Arkanosis/Arkonf/raw/master/tools-src/bdiff.c && \
gcc -Wformat=0 -Wno-long-long bdiff.c -o bdiff && \
rm bdiff.c
运行bdiff
并比较 2 个文件:
./bdiff a.file b.file
bdiff
您可能会发现将输出重定向到文件很有帮助。感谢 @unhammer 的建议和 Git 存储库的链接。
答案4
几天前,当我在一些大型文本文件上使用 diff 时遇到问题时,我尝试了此页面上的解决方案,但没有找到任何对我有用的东西,因此我编写了一个专门用于处理大型文本文件的文件比较程序。返回这里并让您知道它可用似乎是公平的。我自己只使用过它,如果其他遇到大文本文件问题的人可以尝试它并报告它是否对您也有效,我将不胜感激。代码位于https://github.com/gtoal/bigfile-diff-compare