我必须比较Windows平台中包含的两个大小为 2-3 GB 的csv文件。
我试图将第一个放在HashMap中以将其与第二个进行比较,但结果(如预期的那样)是一个非常高的内存消耗。
目标是获取另一个文件的差异。
这些行可能会以不同的顺序出现,也可能会错过。
任何建议?
答案 0 :(得分:3)
假设您希望通过编程在Java中执行此操作,答案是不同的。
是否订购了两个文件?如果是这样,那么你不需要读入整个文件,只需从两个文件的开头开始,然后
如果您没有订购文件,那么也许您可以在差异之前订购文件。同样,由于您需要低内存解决方案,请不要读取整个文件以对其进行排序。将文件切换为可管理的块,然后对每个块进行排序。然后使用插入排序来组合块。
答案 1 :(得分:2)
unix command diff 可用于完全匹配。
您也可以使用-b
标志运行它,以忽略仅有空格的差异。
答案 2 :(得分:1)
我建议您逐行比较,而不是将整个文件上传到内存中。或者尝试只上传一组行。
答案 3 :(得分:1)
有一个用于解析CSV文件的java库OpenCSV。可以构建延迟加载文件。检查this article。希望它有所帮助。
答案 4 :(得分:1)
使用uniVocity-parsers,因为它是最快的Java解析器。您可以非常快速地处理大到100 GB的文件。
为了比较大型CSV文件,我建议您使用自己的RowProcessor实现并将其包装在ConcurrentRowProcessor中。
披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。
答案 5 :(得分:0)
这是Stack Overflow上的另一篇类似文章,其中我给出了一个解决方案的大纲,该解决方案只需要将两个文件中较小的一个存储在内存中:
How to compare two large CSV files and get the difference file
这是一个通用的解决方案,它不需要订购文件,因为你在说明行的顺序可能不同的问题。
无论如何,即使这样也可以避免。我不想在这里重复解决方案,但想法是索引一个文件,然后浏览另一个文件。通过仅保存索引中每行的哈希表和位置,可以避免将整个较小的文件存储在内存中。这样,您将不得不在磁盘上多次触摸该文件,但您不必将其保留在内存中。
算法的运行时间为O(N + M)。内存消耗为O(min(N,M))。