我必须比较两个 csv 文件,每个文件大小为2-3 GB,包含在 Windows 平台中。
我试图将第一个放在 HashMap 中以将其与第二个进行比较,但结果(如预期的那样)是非常高的内存消耗。
目标是在另一个文件中获取差异。
这些行可能会以不同的顺序出现,也可能会丢失。
有什么建议吗?
我必须比较两个 csv 文件,每个文件大小为2-3 GB,包含在 Windows 平台中。
我试图将第一个放在 HashMap 中以将其与第二个进行比较,但结果(如预期的那样)是非常高的内存消耗。
目标是在另一个文件中获取差异。
这些行可能会以不同的顺序出现,也可能会丢失。
有什么建议吗?
假设您希望通过编程在 Java 中执行此操作,答案会有所不同。
两个文件都排序了吗?如果是这样,那么您不需要读取整个文件,只需从两个文件的开头开始,然后
如果您没有订购文件,那么也许您可以在 diff 之前订购文件。同样,由于您需要低内存解决方案,因此不要读取整个文件来对其进行排序。将文件切成可管理的块,然后对每个块进行排序。然后使用插入排序来组合块。
unix 命令 diff 可以用于完全匹配。
您也可以使用-b
标志运行它以忽略仅空格的差异。
使用uniVocity-parsers,因为它带有最快的 Java CSV 解析器。您可以毫无问题且非常快速地处理大至 100 GB 的文件。
为了比较大型 CSV 文件,我建议您使用自己的RowProcessor实现并将其包装在ConcurrentRowProcessor中。
披露:我是这个库的作者。它是开源和免费的(Apache V2.0 许可证)。
我建议您逐行比较,而不是将整个文件上传到内存中。或者尝试只上传一组行。
这是关于 Stack Overflow 的另一篇类似帖子,其中我给出了一个解决方案的概要,该解决方案只需要将两个文件中较小的一个存储在内存中:
这是不需要订购文件的通用解决方案,因为您在问题中指出行的顺序可能不同。
无论如何,即使这样也可以避免。我不想在这里重复解决方案,但想法是索引一个文件,然后遍历另一个文件。您可以通过仅保存哈希表和索引中每一行的位置来避免将整个较小的文件存储在内存中。这样,您将不得不多次访问磁盘上的文件,但不必将其保存在内存中。
该算法的运行时间为 O(N + M)。内存消耗为 O(min(N, M))。