超大型文件比较,内存不足,只能分页读区再匹配,但头都秃了,也没想到优化的方式,朋友们帮帮忙啊。

查看 294|回复 23
作者:FeifeiJin   
有两个本地文件,PersonListA.csv 和 PersonListB.csv ,文件过于巨大,我需要分批读取到内存里,变成 List A 和 List B ,我现在要把 A 和 B 进行对比,获得下面结果:
Person 有两个属性,一个 Name ,一个 Age ,Name 是唯一的,但两个列表中相同 Name 的人 Age 不一样
1 ,找出存在于 A 但不存在于 B 的元素。
2 ,找出存在于 B 但不存在于 A 的元素。
3 ,找出两个列表中不同的元素。
有以下限定条件:
1 ,本地文件过大,无法一次性读取到内存中,需要分页进行比较。
2 ,无法对两个列表进行排序,数据在列表中都是乱序的,需要用 Name 进行匹配。
如果要实现以上 function ,需要用到什么算法,请分析后给出算法的名称。
现在的策略是,把 A 中的数据分为 10 组 10 条,然后把 B 中的数据分为 10 组 10 条的数据,分别拿 A 中的每一组数据和 B 中的每一组数据进行比较,这个方法叫做 GetUniqueResult
1 ,在找到只存在 A 不存在 B 的元素调用一次 GetUniqueResult 。
2 ,在找到只存在 B 不存在 A 的元素调用一次 GetUniqueResult 。
3 ,在通过 FindDiffer 找到 A 和 B 中不同的元素。
相当于我需要循环 3*(10^10)次才能结束,其中也有使用 HashMap 来进行优化,使得实际执行次数小于 3*(10^10)次。(比如 A 中的第一组数据在和 B 的所有数据比较时,如果第一组的所有数据都找到了,就提前结束。)
我现在想问的是,有没有什么更好的算法能从 3*(10^10) 优化到 (10^10),如果能跟优化到 N ( 1 )
有没有什么方法能只对调用一次 GetUniqueResult ,获得全部结果。
-----------------------------------------------
浓缩版:
我有两个本地 FileA.csv 和 FileB.csv ,分别存储了从 Oracle 中和 PostgreSQL 导出的同一个表。
1 ,单个文件超过 10GB ,无法一次性读取到内存中。
2 ,两个导出的文件是乱序的,需要用主键在程序里进行数据匹配(文件无法修改)。
需要获取结果:
1 ,在 A 中存在,但 B 中不存在的数据。
2 ,在 B 中存在,但 A 中不存在的数据。
3 ,在 A 和 B 中都存在,但有差异的数据。
可以有什么办法吗?或者给我一些算法关键字,比如我现在使用的是类哈希分页对比。
1 ,附加条件,不允许排序。(附加这个条件是因为,其实使用外部排序+归并算法可以解决上述问题)
但已经写了巨多的代码,不想去外部排序用新的文件进行比较了。
换而言之,现在只能屎上雕花,自己的💩自己雕。呜呜呜

csv, 存在, 数据, name

FlytoSirius   
1 ,附加条件,不允许排序。(附加这个条件是因为,其实使用外部排序+归并算法可以解决上述问题)
但已经写了巨多的代码,不想去外部排序用新的文件进行比较了。
换而言之,现在只能屎上雕花,自己的💩自己雕。呜呜呜
hefish   
我的第一感觉是, 这个事情应该导入的数据库表里再进行相关操作,
写程序对比不是最佳方案.
10GB 单表在数据库里也不算多大.
你要的那三个比较结果在 SQL 里都是很容易得到的.
FeifeiJin
OP
  
我觉着 ls 的大佬说的对,放 mysql 里就完事了。
min   
@FlytoSirius
@hefish
宝,很感激你们的回复。
因为现在的目的就是用外部程序去验证两个数据库中的数据是否完全一致,且有种种条条框框加成下,只能用程序去读 CSV 去验证哈。
FlytoSirius   
买内存条啊
FeifeiJin
OP
  
@FeifeiJin
那能不能程序直接连接 两端数据库进行对比呢? 毕竟导出这样的两个数 GB 的大表是个容易出问题的过程.
但, 如果就得用程序去对比文件, 那确实要花点时间研究下具体实现.
FeifeiJin
OP
  
@FlytoSirius 真的不能。
Nosub   
@min 谢谢您的回复。
me1onsoda   
如果是 Java 可以试试阿里的 easyexcel ,https://github.com/alibaba/easyexcel
您需要登录后才可以回帖 登录 | 立即注册

返回顶部