0

我有以下形式的 10GB 数据:

A=good
B=c++

现在我想找出B的。例如,我希望找出“c++”,因为对于这种情况......我针对这个问题所遵循的方法是选择 B 部分(即首先是第二行),然后从那里找出一个相等的字符串到 B 的字符串。然后在第二轮循环中..我正在寻找 B 的另一个值(现在是第 4 行),然后从那里找到一个具有相等字符串的 B....等等

但是,上述方法需要很多时间,Python中是否有其他方法可以有效地解决这个问题。

4

4 回答 4

8

由于您的文件太大而无法轻松放入内存中,如何:

  1. 拆分成两个文件,As和Bs
  2. 对每个进行排序(例如,使用 unixsort或 Python 外部内存归并排序)
  3. 执行合并排序的合并步骤以查找重复项
于 2012-06-15T16:18:57.200 回答
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)

这给出了相同的结果,同时仅涉及将一半的数据存储在内存中(如果存在大量数据重复,则更少),并且由于集合查找的高效性,效率仍然高得多。

于 2012-06-15T16:15:59.497 回答
1

由于此数据太大,我建议将其存储在 mysql 之类的数据库中。然后,您的问题通过单行查询得到解决。

select * from t1,t2 where t1.a=t2.b;

这是一个替代建议。如果你选择去,mysqldb模块可以帮助你连接python和mysql。

于 2012-06-15T17:01:26.883 回答
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 和 value,按 value 排序,并找到相邻的对。它假设所有字符串都没有子字符串“ * ”,但是您可以将其替换为您知道不会出现的任何其他子字符串。

于 2012-06-15T16:46:22.220 回答