当前位置:编程学习 > JAVA >>

急求:两个千万级数据比对过滤

现有有两个txt文件,比如a.txt,b.txt,这两个文件里面都是有一千万条数据.现在对这两个文件当中重复的文件过滤掉,把b.txt存在,而a.txt中不存在的数据写到c.txt当中.我试过用list这种普通的过滤会抛内存溢出.不知道还有没其它的好方面.求助各位高手. 数据比对 数据过滤 --------------------编程问答-------------------- 这倒是没遇到过,友情帮顶 --------------------编程问答-------------------- 顶上去. --------------------编程问答-------------------- 因为a.txt,b.txt两个文件里面的数据达到一千万条数据.我很难想象这能用内存一次读出来进行比较。所以只能逐条读入进行对比,但如果你的数据有一定的规律,比如按照一定的排序方式还能操作,如果不是一定的顺序,那我个人建议你还是借用数据库工具通过SQL来实现吧。 --------------------编程问答-------------------- 最好的方式用hadoop --------------------编程问答-------------------- 我有个思路,仅供参考:
对比多条复杂的记录很慢,但是对比一堆hashcode要快的多,所以,创建两个临时文件 a.txt.index和b.txt.index,这两个临时文件中只有三列信息:某条记录在x.txt的文件位置、记录长度和此条记录hashcode。
一次从a.txt.index取十万条记录 放到内存用不了多少M。再于b.txt.index分批比较,由于只需要比较hashcode,比较速度应该是比较快的。 --------------------编程问答-------------------- 我觉得用计数器统计 每隔几万条数据 手动清空下缓存不知道可行不 --------------------编程问答--------------------
引用 5 楼 AFer198215 的回复:
我有个思路,仅供参考:
对比多条复杂的记录很慢,但是对比一堆hashcode要快的多,所以,创建两个临时文件 a.txt.index和b.txt.index,这两个临时文件中只有三列信息:某条记录在x.txt的文件位置、记录长度和此条记录hashcode。
一次从a.txt.index取十万条记录 放到内存用不了多少M。再于b.txt.index分批比较,由于只需要比……

我刚算了一下,1000万条索引信息占用内存约为 1000*10000*(8+8+4)/1024/1024不到200M,应该可以都读到内存。 --------------------编程问答--------------------
引用 7 楼 AFer198215 的回复:
引用 5 楼 AFer198215 的回复:我有个思路,仅供参考:
对比多条复杂的记录很慢,但是对比一堆hashcode要快的多,所以,创建两个临时文件 a.txt.index和b.txt.index,这两个临时文件中只有三列信息:某条记录在x.txt的文件位置、记录长度和此条记录hashcode。
一次从a.txt.index取十万条记录 放到内存用不了多少M。再于……
--------------------编程问答-------------------- 用nio,切勿一次性读入内存。 --------------------编程问答-------------------- 分批比对吧。
另外感觉对比的算法上应该提高。
要是双list循环比对绝对崩。 --------------------编程问答--------------------
引用 5 楼 AFer198215 的回复:
我有个思路,仅供参考:
对比多条复杂的记录很慢,但是对比一堆hashcode要快的多,所以,创建两个临时文件 a.txt.index和b.txt.index,这两个临时文件中只有三列信息:某条记录在x.txt的文件位置、记录长度和此条记录hashcode。
一次从a.txt.index取十万条记录 放到内存用不了多少M。再于b.txt.index分批比较,由于只需要比……

好,但hashcode相等不代表原记录一定相等怎么办? --------------------编程问答--------------------
引用 11 楼 dracularking 的回复:
好,但hashcode相等不代表原记录一定相等怎么办? 


那么上CRC或MD5吧 --------------------编程问答--------------------
引用 11 楼 dracularking 的回复:
好,但hashcode相等不代表原记录一定相等怎么办? 

真的会出现这种情况? --------------------编程问答--------------------
引用 13 楼 AFer198215 的回复:
引用 11 楼 dracularking 的回复:好,但hashcode相等不代表原记录一定相等怎么办? 
真的会出现这种情况?

这就是所谓的hash collision嘛
--------------------编程问答-------------------- 读取流的时候可以分批读取,比如说每次读取十万行进行比较。 --------------------编程问答-------------------- 友情帮顶
学习学习 --------------------编程问答-------------------- 一枚菜鸟,领走。 --------------------编程问答-------------------- function B:
b切成n份
for(i=0; i<n; i++) {
    将切片传入A中进行验证
}

a切分成m份
function A:
for(i=0; i<m; i++) {
    将B的某个切片 放进来比对A的切片
    每次比对 , 清理内存
} --------------------编程问答-------------------- 这个比较难
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,