【发布时间】:2011-08-18 12:36:02
【问题描述】:
关于您对我的“技术”的看法,我有一个一般性问题。
有 2 个文本文件(file_1 和 file_2)需要相互比较。两者都非常庞大(3-4 GB,每个从 30,000,000 到 45,000,000 行)。
我的想法是将file_1 的几行(尽可能多)读入内存,然后将它们与file_2 的all 行进行比较。如果匹配,则两个文件中匹配的行将写入新文件。然后继续file_1 的下 1000 行,并将它们与file_2 的所有行进行比较,直到我完全通过 file_1。
但这对我来说听起来真的非常非常耗时且复杂。 你能想出其他方法来比较这两个文件吗?
您认为比较需要多长时间? 对于我的程序,时间并不重要。我没有处理如此大文件的经验,因此我不知道这可能需要多长时间。不过应该不会超过一天。 ;-) 但我担心我的技术可能需要永远......
我刚想到的另一个问题:你会读多少行到内存中?越多越好?有没有办法在实际尝试之前确定可能的行数? 我想尽可能多地阅读(因为我认为这样会更快)但我经常会耗尽内存。
提前致谢。
编辑 我想我必须多解释一下我的问题。
目的不是看这两个文件是否相同(它们不是)。
每个文件中有一些行具有相同的“特征”。
这是一个例子:
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
file_2看起来像这样:
mat3 10009 TEXT
mat3 200 TEXT
mat1 999 TEXT
TEXT 指的是我不感兴趣的字符和数字,mat 可以从mat1 - mat50 去并且没有顺序;也可以有 1000x mat2 (但下一列中的数字不同)。我需要以某种方式找到拟合线:matX 在两条比较线中都相同,file_2 中提到的数字适合file_1 中提到的范围。
因此,在我的示例中,我会找到一个匹配项:file_1 的第 3 行和file_2 的第 1 行(因为两者都是 mat3,而 10009 介于 10000 和 10010 之间)。
我希望这能让你明白!
所以我的问题是:您将如何搜索匹配的行?
是的,我使用 Java 作为我的编程语言。
编辑 我现在先分割大文件,这样我就不会遇到内存不足的问题。我还认为将(许多)较小的文件相互比较比这两个大文件更快。之后,我可以按照我上面提到的方式比较它们。这可能不是完美的方法,但我仍在学习 ;-) 尽管如此,您的所有方法都对我很有帮助,谢谢您的回复!
【问题讨论】:
-
你用
java标记了这个问题,这是否意味着你只想用Java来做? -
不知道能不能帮到你stackoverflow.com/questions/964332/…
-
听起来像是内存映射的好用例(并首先对文件进行碎片整理),但我不知道 Java 是否提供。
-
不确定我是否理解您的要求。您是否需要找到两个文件之间共有的行?或者你真的想要做一个差异?
-
在这种情况下,您预处理 file_2 以便您拥有 50 个数据结构 (mat1..mat50),每个数据结构都有一个按下限排序的范围数组,因此您可以对其进行二进制搜索。 40.000.000 行占用的空间不应超过 1GB。然后依次遍历file_1,查找每一行。
标签: java file comparison