有没有更有效的方法来协调大型数据集?

Chr*_*ris 5 c# memory optimization comparison

我的任务是协调两个大数据集(两个大的交易列表)。基本上,我将两个数据源中的相关字段提取到两个相同格式的文件中,然后比较这些文件以查找在 A 中但不在 B 中的任何记录,反之亦然,并报告它们。我写了一篇关于我为实现这一目标所做的最大努力的博客文章(如果有兴趣,请点击)。

它的要点是将两个数据集加载到一个大哈希表中,键是行,值每次出现在文件 A 中时为 +1,每次出现在文件 B 中时为 -1。然后在最后,我寻找值 != 0 的任何键/值对。

我的算法似乎足够快(2*100mb 文件需要 10 秒),但是它有点内存密集型:280mb 比较两组 100mb 文件,我希望将其降低到 100mb 峰值内存使用量,如果两个数据集以大致相同的顺序排序。

有任何想法吗?

另外,让我知道这对 SO 来说是否过于开放。

Kev*_*bet 2

我仅在 unix 上使用 shell 和 perl 的脚本中做了类似的事情,但是该理论可能会继续下去。

第 1 步,对两个文件进行排序,使它们按照相同的标准排序。我使用 unix sort 命令来执行此操作(我需要唯一的标志,但您只需要某种内存有效的文件排序)。这可能是您自己弄清楚的棘手部分。

步骤 2,打开这两个文件,并逐行扫描它们(如果是二进制格式,则逐条记录)。如果左侧文件中的行与右侧文件中的行相同,则这些行匹配并继续前进(记住我们已经对文件进行了排序,因此最小的记录应该位于第一个)。

如果左侧记录大于右侧记录,则右侧记录丢失,将其添加到列表中,然后读取右侧文件的下一行。您只需再次检查一下即可。如果您的右侧记录大于左侧记录,则同样的情况也适用,请报告并继续。

扫描记录应该非常节省内存。它可能没有那么快,但对我来说,我能够在几分钟内通过多次查看不同字段来处理几大数据。