我有两个数据文件,每个100个字符行。文件A:10 8 行,文件B:10 6 行。我需要找到文件B中不在文件A中的所有字符串。
起初我在考虑将两个文件都提供给mysql,但看起来它不会在10个 8 记录上创建一个唯一的密钥。
我正在等待你的建议。
答案 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