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

Java 如何比较非常大的csv文件中的差异,java,csv,large-files,Java,Csv,Large Files,我必须比较Windows平台中包含的两个大小分别为2-3 GB的csv文件 我曾尝试将第一个放在HashMap中,以将其与第二个进行比较,但结果(正如预期的那样)是非常高的内存消耗 目标是在另一个文件中获取差异 这些行可能以不同的顺序出现,也可能遗漏 有什么建议吗?我建议您逐行比较,不要将整个文件上传到内存中。或者尝试只上传一组行。可以进行精确匹配 您还可以使用-b标志运行它,以忽略仅空白的差异。假设您希望通过编程在Java中实现这一点,答案是不同的 这两个文件都订好了吗?如果是这样,则不需要读

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

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

目标是在另一个文件中获取差异

这些行可能以不同的顺序出现,也可能遗漏


有什么建议吗?

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

可以进行精确匹配


您还可以使用
-b
标志运行它,以忽略仅空白的差异。

假设您希望通过编程在Java中实现这一点,答案是不同的

这两个文件都订好了吗?如果是这样,则不需要读取整个文件,只需从两个文件的开头开始,然后

  • 如果条目匹配,则推进两个文件中的“当前”行
  • 如果条目不匹配,确定哪个文件的行将首先出现,显示该行,并在该文件中前进当前行
  • 如果您没有已排序的文件,那么也许您可以在差异之前对文件进行排序。同样,由于您需要低内存解决方案,因此不要读取整个文件来对其进行排序。将文件切碎为可管理的块,然后对每个块进行排序。然后使用插入排序组合块。

    有一个用于解析CSV文件的java库。可以构建文件的延迟加载。检查。希望有帮助。

    使用最快的Java CSV解析器。您可以快速处理100 GB大小的文件,而不会出现任何问题

    对于大型CSV文件的比较,我建议您使用自己的实现,并将其包装在一个文件夹中


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

    这里是另一个类似的关于堆栈溢出的帖子,我在其中概述了一个解决方案,该解决方案只需要将两个文件中较小的文件存储在内存中:

    这是一般的解决方案,不需要对文件进行排序,正如您在问题中所说的,行的顺序可能不同

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


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

    你所说的“比较”是什么意思?你只是想知道它们是否相同,还是想寻找更像diff工具的东西?更多细节会有所帮助。这些文件是按顺序排列的,这样你就可以假设它们将运行相同的行(如果是这样,你可以并行地迭代它们,只显示diff,有点像diff命令或它的任何图形等价物)。你试过众多的“diff”工具吗?(当然,由于您可以用Java打开和读取文件,因此简单地逐行比较并不困难。您确实需要找出不匹配的策略,但根据预期的不匹配类型,这可能相当简单。)您说过它们的顺序可能不同,所以是否有一个字段唯一标识一条记录?如果没有,您是否只想找到有多少条记录具有相同的值?报告的差异是否必须是字段特定的或标记记录是否足够?抱歉,这是针对windows平台的。windows平台上存在Diff,但您需要安装它。您可以要么安装独立的可执行文件(标准GNU工具有一个到windows的端口),要么你可以安装cygwin,它还将提供一个bash shell和许多unix兼容层。非常感谢@Edwin Buck,但我需要在Java下控制程序