首页 / JAVA / java – 如何比较大文本文件?
java – 如何比较大文本文件?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何比较大文本文件?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2679字,纯文字阅读大概需要4分钟。
内容图文
![java – 如何比较大文本文件?](/upload/InfoBanner/zyjiaocheng/702/cedb68d0448247ad9a386c711dfb6bbb.jpg)
关于你对我的“技巧”的看法,我有一个普遍的问题.
有2个文本文件(file_1和file_2)需要相互比较.两者都非常庞大(3-4千兆字节,每个30,000,000到45,000,000行).
我的想法是将file_1的几行(尽可能多)读入内存,然后将它们与file_2的所有行进行比较.如果匹配,则匹配的两个文件中的行应写入新文件.然后继续使用file_1的下一行1000行,并将这些行与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作为我的编程语言.
编辑
我现在首先将大文件分开,以便我没有内存不足的问题.我还认为比这两个巨大的文件比较(很多)小文件要快得多.之后,我可以按照上面提到的方式对它们进行比较.它可能不是完美的方式,但我还在学习;-)
尽管如此,你所有的方法对我都非常有帮助,谢谢你的回复!
解决方法:
既然你已经给了我们更多的细节,我将采取的方法依赖于预分区,并且可选地在搜索匹配之前进行排序.
这应该消除大量的比较,这些比较在天真的暴力方法中无论如何都是不匹配的.为了争论,让我们将这两个文件都固定在每个4000万行.
分区:读取file_1并将以mat1开头的所有行发送到file_1_mat1,依此类推.对file_2执行相同操作.这是一个微不足道的小grep,或者你是否希望用Java编程实现它是一个初学者的练习.
这是一次通过两个文件,总共读取了8000万行,产生了两组平均每个800,000行的50个文件.
排序:对于每个分区,仅根据第二列中的数值排序(file_1的下限和file_2的实际数字).即使800,000行无法适应内存,我想我们可以调整双向外部合并排序,并且比整个未分区空间更快地执行此操作(更少的整体读取).
比较:现在你只需要通过两对file_1_mat1和file_2_mat1迭代一次,而不需要在内存中保留任何内容,输出匹配到输出文件.依次重复其余分区.无需最终的“合并”步骤(除非您并行处理分区).
即使没有排序阶段,您已经在做的天真比较应该在50对文件中更快地工作,每个文件有800,000行,而不是两个文件,每个文件有4000万行.
内容总结
以上是互联网集市为您收集整理的java – 如何比较大文本文件?全部内容,希望文章能够帮你解决java – 如何比较大文本文件?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。