如何比较大文本文件?

Grr*_*ace 9 java comparison file

关于你对我的"技巧"的看法,我有一个普遍的问题.

有2个文本文件(file_1file_2)需要相互比较.两者都非常庞大(3-4千兆字节,每个30,000,000到45,000,000行).我的想法是读取file_1内存中的几行(尽可能多),然后将它们与所有行进行比较file_2.如果匹配,则匹配的两个文件中的行应写入新文件.继续接下来的1000行,file_1并将这些行与所有行进行比较,file_2直到我file_1完全通过.

但这对我来说实际上非常非常耗时且复杂.你能想到比较这两个文件的任何其他方法吗?

您认为比较可能需要多长时间?对于我的计划,时间并不重要.我没有使用过如此庞大的文件的经验,因此我不知道这需要多长时间.它不应该超过一天.;-)但我担心我的技术会永远存在......

刚出现在我脑海中的Antoher问题:你会在内存中读到多少行?越多越好?有没有办法在实际尝试之前确定可能的行数?我想尽可能多地阅读(因为我认为这更快)但我经常用完内存.

提前致谢.

编辑 我想我必须多解释一下我的问题.

目的不是看两个文件是否相同(它们不是).每个文件中都有一些共享相同"特征"的行.这是一个例子: file_1看起来有点像这样:

mat1 1000 2000 TEXT      //this means the range is from 1000 - 2000
mat1 2040 2050 TEXT
mat3 10000 10010 TEXT
mat2 20 500 TEXT
Run Code Online (Sandbox Code Playgroud)

file_2看起来像这样:

mat3 10009 TEXT
mat3 200 TEXT
mat1 999 TEXT
Run Code Online (Sandbox Code Playgroud)

TEXT是指对我不感兴趣的字符和数字,mat可以来自mat1 - mat50并且没有顺序; 也可以有1000倍mat2(但下一列中的数字是不同的).我需要以这样的方式找到拟合线:matX在两个比较线中是相同的,所提到的数字file_2符合上述范围file_1.所以在我的例子中我会找到一个匹配:第3行file_1和第1行file_2(因为mat3和10009都在10000和10010之间).我希望这能让你清楚!

所以我的问题是:你会如何搜索匹配的行?

是的,我使用Java作为我的编程语言.

编辑 我现在首先分割大文件,以便我没有内存不足的问题.我还认为比这两个巨大的文件比较(很多)小文件要快得多.之后,我可以按照上面提到的方式对它们进行比较.它可能不是完美的方式,但我仍然在学习;-)尽管如此,你所有的方法对我都非常有帮助,谢谢你的回复!

Ali*_*ael 1

现在您已经向我们提供了更多细节,我将采取的方法依赖于预分区,并且可以选择在搜索匹配之前进行排序。

这应该消除大量的比较,否则在简单的蛮力方法中无论如何都不会匹配。为了便于讨论,让这两个文件各有 4000 万行。

分区:通读并发送以tofile_1开头的所有行,依此类推。对 执行同样的操作。这对于一点点来说是微不足道的,或者如果您希望在 Java 中以编程方式完成它,这只是初学者的练习。mat1file_1_mat1file_2grep

一次遍历两个文件,总共读取 8000 万行,生成两组 50 个文件,每个文件平均每个 800,000 行。

排序:对于每个分区,仅根据第二列中的数值进行排序(下限来自file_1,实际数字来自file_2)。即使 800,000 行无法放入内存,我想我们也可以采用 2 路外部合并排序,并且比整个未分区空间的排序更快(总体读取更少)。

比较:现在您只需对两对和进行一次迭代,无需在内存中保留任何内容,并将匹配项输出到输出文件。依次对其余分区重复此操作。不需要最后的“合并”步骤(除非您并行处理分区)。file_1_mat1file_2_mat1

即使没有排序阶段,您已经进行的简单比较在 50 对每个包含 800,000 行的文件中也应该比在两个每个包含 4000 万行的文件中运行得更快。