大数据排序和搜索

时间:2010-10-13 18:15:26

标签: sorting search bigdata

我有两个数据文件,每个100个字符行。文件A:10 8 行,文件B:10 6 行。我需要找到文件B中不在文件A中的所有字符串。
起初我在考虑将两个文件都提供给mysql,但看起来它不会在10个 8 记录上创建一个唯一的密钥。

我正在等待你的建议。

3 个答案:

答案 0 :(得分:5)

您可以在没有数据库的情况下执行此操作。关键是减小A的大小,因为A比B大得多。以下是如何做到这一点:

使用适当的哈希函数为B文件中的字符串计算64位哈希值。将它们存储在内存中(在哈希表中),您可以这样做,因为B很小。然后逐行散列A文件中的所有字符串,并查看每个字符串是否与B文件的散列匹配。具有匹配哈希值的任何行(从B中的一行)应存储在文件C中。

当此过程完成时,文件C将具有可能匹配的字符串A的小子集(到B)。现在你有一个小得多的文件C,你需要比较B的行。这可以将问题简化为一个问题,即您可以将C中的所有行实际加载到内存中(作为哈希表)并比较B的每一行以查看它是否在C中。

答案 1 :(得分:3)

你可以稍微提高@ michael-goldshteyn的答案(https://stackoverflow.com/a/3926745/179529)。由于您需要查找B中不在A中的所有字符串,因此当您比较并找到与A中的元素匹配时,可以从B的元素的哈希表中删除任何项目。保留在哈希表中的是文件A中找不到的元素。

答案 2 :(得分:1)

对于您提到的尺寸,您应该能够将所有B保留在内存中,因此您可以对Goldshteyn的答案进行简化版本;在python中这样的东西:

#!/usr/bin/python3

import sys

if __name__=='__main__':
  b = open(sys.argv[2],'r')
  bs = set()
  for l in b:
    bs.add(l.strip())
  b.close()
  a = open(sys.argv[1],'r')
  for l in a:
    l = l.strip()
    if l in bs:
      bs.remove(l)
  for x in bs:
    print(x)

我在两个10 ^ 5和10 ^ 7大小的文件上测试了这个,在原子处理器上每行约8个字符。来自/ usr / bin / time的输出:

25.15user 0.27system 0:25.80elapsed 98%CPU (0avgtext+0avgdata 56032maxresident)k
0inputs+0outputs (0major+3862minor)pagefaults 0swaps
  60298   60298  509244