日期:2014-05-20  浏览次数:20659 次

大文本文件数据对比方案
请大家帮帮忙,帮我解决这个问题:

现在有 两个 大文本文件(大概100M)  里面是分行 一条条记录都是字符串,两个文件现在要作对比,文件中每一行 都会有一段字符串作为一个id, 有两个文件相应的id映射文件。。。 
有字段映射文件(字段大概160多个) 也就是文件中每一行 其实也就是相当于数据库中的一条记录

在要比较 这两个文件的差异  也就是比较每一条记录的各字段值的差异
最后输出到一个新的文本文件 并统计结果

这个东西看起来很简单  如果数据量小  实现起来并不难 但是现在频繁io和一些大数据量加载 经常出现 内存溢出

希望大家帮我想想办法 设计个性能好点的方案 先在这里谢谢大家了
数据比较?大文本?IO

------解决方案--------------------
有个想法,不知道效果如何。
根据"id映射文件"对其中一个文件A的记录按照另一个文件B的记录顺序重新排序得到文件C(大文件排序可使用外排序),然后对文件B和C逐行比较。
------解决方案--------------------
分段比。。
拿一条数据去从另一张表中找出该数据肯定不合理。。
设计几个固定的位置,把2张大表的对比改成进行10次对比,每次是2张小表。。
------解决方案--------------------
如果连位置都不一样,既第一个文件ID=1的行 与第二个文件ID=1的行不在同一行上,那就麻烦了。
否则的话可以分段读取对比。
------解决方案--------------------
100M不算大。可以先把字段映射文件读入内存,存入map。然后按行读取两个文件,读的时候将表示Id的字串解析出来,作为key,存入map。再遍历其中一个map,根据映射关系,找到另一个map中的对应字段,进行比较。如果文件太大,可以分段,不过就不好实现了。
------解决方案--------------------
如果两个文件不是顺利比较,分段比较也是一个麻烦事啊。
这个问题可以采集,分布比较。
先对每个文件进行排序,排序的过程,根据ID的特性,分成不同的几个文件。
比如A文件的ID分为1~5,5~10等文件。B文件也同样分为几个文件。
再利用多线程分别比较相对于的小文件(充分利用多线程的优势)。
文件的划分排序网上有很多!
------解决方案--------------------
用两个Map做比较,key相同Value不同,或者key少或多,都返回不同。

这个思路会实现比较快吧,就是内存大了点。

分段也不是很困难的做法,比较分几段还是自己代码控制的