我对你对我的“技术”的看法有一个普遍的疑问。如何比较大型文本文件?
有两个文本文件(file_1
和file_2
)需要相互比较。两者都非常巨大(3-4千兆字节,每个3000万到4500万行)。 我的想法是将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
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中? –
我不知道这是否可以帮助你 http://stackoverflow.com/questions/964332/java-large-files-disk-io-performance –
听起来像是不错的使用情况内存映射(和首先对文件进行碎片整理),但我不知道Java是否提供了这种功能。 –