如何有效地搜索文件中的字符串?

时间:2012-06-15 16:12:07

标签: python algorithm

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

A=good
B=c++

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

然而,上述方法需要花费大量时间,Python中是否有其他方法可以有效地解决这个问题。

4 个答案:

答案 0 :(得分:8)

由于您的文件太大而无法轻松放入内存,所以:

  1. 分为两个文件,As和Bs
  2. 对每个进行排序(例如,使用unix sort或Python外部内存mergesort)
  3. 执行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和值,按值排序,并找到相邻的对。它假设没有字符串具有子字符串“ * ”,但您可以将其替换为您知道不会显示的任何其他子字符串。