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