找到两个非常大的列表之间的区别

时间:2011-02-06 06:34:58

标签: database sorting

我有两个大型列表(可能是一亿个项目),每个列表的源可以是数据库表或平面文件。这两个列表都具有相似的大小,都是未分类的。我需要找到它们之间的区别。所以我有3个场景:
1. List1是一个数据库表(假设每行只有一个项目(key)是一个字符串),List2是一个大文件。
2.两个列表都来自2个数据库表 3.两个列表都来自两个文件。


在案例2中,我打算使用:

select a.item from MyTable a where a.item not in (select b.item form MyTable b)
这显然效率低下,还有更好的方法吗?

另一种方法是:
我计划对每个列表进行排序,然后沿着它们走下去找到差异。如果列表来自文件,我必须首先将其读入db表,然后使用db排序输出列表。数据库排序中的运行时复杂度是否仍为O(nlogn)?

任何一种方法都是一种痛苦,当涉及的清单中有数亿件物品时,这种方法似乎会很慢。有什么建议?

2 个答案:

答案 0 :(得分:1)

  1. 在所有场景下将两组都集成到数据库中...这种排序和确定是db的用途。其他任何东西都会重新发明轮子。
  2. 以下内容可能比NOT IN快(但要测试一下):

    从MyTable中选择a.item a LEFT JOIN MyTable B ON A.JoinColumn = B.JoinColumn B.JoinColumn IS NULL

  3. 确保您的JoinColumns已编入索引。索引将使排序的整个问题变得糟糕。

答案 1 :(得分:1)

这不是一个真正的数据库问题。

步骤1.将两个列表排序。也许数据库列表已经排序,但如果没有,则按排序顺序导出,或者如果需要多次排序,则创建一个索引。

步骤2.使用排序实用程序在文本文件中生成列表的排序副本。如果这些列表超出了UNIX排序实用程序的功能,请将它们分解,对每个列表进行排序,并在应用程序中包含这些列表的合并。

步骤3.编写应用程序以对两个列表应用合并算法,并以这种方式识别差异。请注意,如果文本文件是多个块,则需要辅助合并算法以按排序顺序提供主算法。

请注意,如果您无法使用UNIX或Linux对文本文件进行排序,请获取UNIX排序命令的源代码并将其移植到您的操作系统。 This article explains why.