繁体   English   中英

如何比较非常大的csv文件中的差异

[英]How to compare differences in very large csv files

我必须比较两个大小为2-3 GB的 csv文件,包含在Windows平台中。

我试图将第一个放在HashMap中与第二个进行比较,但结果(如预期的那样)是一个非常高的内存消耗。

目标是获取另一个文件的差异。

这些行可能会以不同的顺序出现,也可能会错过。

任何建议?

假设您希望通过编程在Java中执行此操作,答案是不同的。

两个文件都是订购的吗? 如果是这样,那么你不需要读入整个文件,只需从两个文件的开头开始,然后

  1. 如果条目匹配,则在两个文件中前进“当前”行。
  2. 如果条目不匹配,请确定首先显示哪个文件的行,显示该行,然后前进该文件中的当前行。

如果您没有有序文件,那么也许您可以在diff之前订购文件。 同样,由于您需要低内存解决方案,请不要读取整个文件以对其进行排序。 将文件切换为可管理的块,然后对每个块进行排序。 然后使用插入排序来组合块。

unix命令diff 可以用于完全匹配。

您也可以使用-b标志运行它以忽略仅有空格的差异。

使用uniVocity解析器,因为它带有最快的Java解析器。 您可以快速处理大至100 GB的文件而不会出现任何问题。

为了比较大型CSV文件,我建议您使用自己的RowProcessor实现并将其包装在ConcurrentRowProcessor中

披露:我是这个图书馆的作者。 它是开源和免费的(Apache V2.0许可证)。

我建议你逐行比较,而不是将整个文件上传到内存中。 或者尝试只上传一组线。

有一个用于解析CSV文件的Java库OpenCSV 可以构建延迟加载文件。 看看这篇文章 希望能帮助到你。

这是Stack Overflow上的另一篇类似文章,其中我给出了一个解决方案的大纲,该解决方案只需要将两个文件中较小的一个存储在内存中:

如何比较两个大型CSV文件并获取差异文件

这是一般解决方案,不需要对文件进行排序,因为您在说明行的顺序可能不同的问题。

无论如何,即使这样也可以避免。 我不想在这里重复解决方案,但想法是索引一个文件,然后浏览另一个文件。 通过仅保存索引中每行的哈希表和位置,可以避免将整个较小的文件存储在内存中。 这样,您将不得不在磁盘上多次触摸该文件,但您不必将其保留在内存中。

算法的运行时间为O(N + M)。 内存消耗为O(min(N,M))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM