我有以下形式的10GB数据:
A=good
B=c++
现在我想找出B&#39。例如,我希望找到" c ++",因为对于这种情况......我关注这个问题的方法是选择B部分(即第一行的第一行)并从那里找出一个等于B&#39的字符串的字符串。然后在第二轮循环中......我正在寻找B的另一个值(现在是第4行)并从那里找到一个具有相同字符串的B ......等等
然而,上述方法需要花费大量时间,Python中是否有其他方法可以有效地解决这个问题。
答案 0 :(得分:8)
由于您的文件太大而无法轻松放入内存,所以:
sort
或Python外部内存mergesort)答案 1 :(得分:2)
执行此操作的最佳方法是读取数据,构建一组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)
这给出了相同的结果,只涉及将一半数据存储在内存中(如果存在大量重复数据,则会更少),并且由于集查找的有效性,它仍然更有效。
答案 2 :(得分:1)
由于这个数据太大,我建议将它存储在像mysql这样的数据库中。然后通过一行查询解决您的问题。
select * from t1,t2 where t1.a=t2.b;
这是另一种建议。如果你选择去,mysqldb模块可以帮助你连接python和mysql。
答案 3 :(得分:0)
运行:
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和值,按值排序,并找到相邻的对。它假设没有字符串具有子字符串“ * ”,但您可以将其替换为您知道不会显示的任何其他子字符串。