2012-05-17 45 views
1

如何比较不同我有两个CSV文件,比较大小2-3 GB每一个,包含在Windows平台。非常大的CSV文件

我试图把一个HashMap中第一个把它与第二个比较,但结果(如预期)是一个非常高的内存cosumption。

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

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

任何暗示?

+7

你是什么意思由“比较”?你只是想知道它们是否相同,或者你是否在寻找更像差异化工具的东西? –

+1

更多细节将有所帮助。就像这些文件是有序的,所以你可以假设他们将有相同的行(如果是的话,你可以并行地遍历它们显示diff差不多像diff命令或它的任何图形等价物)。 –

+0

您是否尝试过任何众多的“差异”工具? –

回答

1

假设你希望在Java中这样做,通过编程,答案是不同的。

是否订购了这两个文件?如果是这样,那么你就需要在整个文件的读取,你只需在开始这两个文件的开头,

  1. 如果条目匹配,推进两个文件中的“当前”行。
  2. 如果输入不匹配,确定文件的行会来这第一次,显示该行,并推进当前行在该文件中

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

1

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

2

unix command diff可以工作的确切匹配。

您也可以与-b标志运行它忽略空白唯一的区别。

+0

对不起,这是针对windows平台的 – richarbernal

+0

差异存在于Windows平台上,但您需要安装它。您可以安装独立的可执行文件(标准GNU工具的窗口有一个端口),也可以安装cygwin,它还将提供bash shell和许多unix兼容性层。 –

+0

非常感谢@Edwin Buck,但我需要在Java下控制程序 – richarbernal

1

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

1

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

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

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

0

这里是一个堆栈溢出其他类似的帖子中,我都给予了解决方案仅需要两个文件的小存储在内存中的轮廓:

How to compare two large CSV files and get the difference file

这是一般这个解决方案不需要文件的排序,因为你在提出这样的问题,即排序的顺序可能不同。

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

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

相关问题