我有以下形式的 10GB 数据:
A=good
B=c++
现在我想找出B的。例如,我希望找出“c++”,因为对于这种情况......我针对这个问题所遵循的方法是选择 B 部分(即首先是第二行),然后从那里找出一个相等的字符串到 B 的字符串。然后在第二轮循环中..我正在寻找 B 的另一个值(现在是第 4 行),然后从那里找到一个具有相等字符串的 B....等等
但是,上述方法需要很多时间,Python中是否有其他方法可以有效地解决这个问题。
由于您的文件太大而无法轻松放入内存中,如何:
sort
或 Python 外部内存归并排序)这样做的最好方法是读入数据,构造一组A
项目和一组B
项目。然后,您只需找到两者之间的交集。
唯一潜在的缺点是您需要一次将所有数据放入内存中。鉴于您的数据集很大,这可能是个问题。如果你能处理一半,那么你可以创建你的A
项目集,然后通过B
项目检查对集。
例子:
使用输入数据:
A=good
B=c++
A=df
B=kj
A=c++
B=programming language
第一种方法可以像这样简单地完成:
a = set()
b = set()
with open("test") as data:
for line in data:
line_data = line[2:].strip()
if line.startswith("A"):
a.add(line_data)
else:
b.add(line_data)
print(a & b)
给我们:
{'c++'}
第二种方法可以这样做:
with open("test") as data:
a = {line[2:].strip() for line in data if line.startswith("A")}
with open("test") as data:
results = {item for item in (line[2:].strip() for line in data if line.startswith("B")) if item in a}
print(results)
这给出了相同的结果,同时仅涉及将一半的数据存储在内存中(如果存在大量数据重复,则更少),并且由于集合查找的高效性,效率仍然高得多。
由于此数据太大,我建议将其存储在 mysql 之类的数据库中。然后,您的问题通过单行查询得到解决。
select * from t1,t2 where t1.a=t2.b;
这是一个替代建议。如果你选择去,mysqldb模块可以帮助你连接python和mysql。
运行这个:
cat huge_file | awk 'BEGIN {FS = "="} { print $2 "***" $1 }' | sort -n | awk 'BEGIN {FS = "\\*\\*\\*"} { if (prev == $1 && $2 == "B") { print $1 } prev = $1 }'
这会将它们拆分为 A/B 和 value,按 value 排序,并找到相邻的对。它假设所有字符串都没有子字符串“ * ”,但是您可以将其替换为您知道不会出现的任何其他子字符串。