3

あるファイルの値を別の行で検索しています。正確な値は、検索ファイルで 1 回だけ出現します。このプロセスを高速化するにはどうすればよいですか? これが私の現在のコードです:

filltaxlist = open("file with query number.txt", "rw")
fulltaxa = open("output file with hit line match", "rw")

for line in filltaxalist:
    line = line.strip()
    taxid = re.split("\t", line)
    lookup = taxid[5] # this value is a number and I need the exact match only so I convert it to an integer
    int1 = int(lookup)
    for line in open("File to search.txt", "r"):
        data = re.split(',', line)
        hit = int(data[0]) # every value in this file is a number separated by a ,
        if lookup in line:
            if int1 == hit:
                fulltaxa.write(line)

これは非常に遅く書かれているため、うまく機能します。また、検索しているファイルのサイズは GB を超えています。の

行の例filltaxlist:

cvvel_1234    403454663    29.43    3e-30    55.55555555234    1172189
cvell_1444    2342333      30.00    1e-50    34.34584359345    5911
cvell_1444    234230055    23.23    1e-60    32.23445983454    46245
cvell_1444    233493003    23.44    1e-43    35.23595604593    46245

fulltaxa返すべきもの:

1172189, 5943, 1002030, 12345
5911, 11234, 112356, 234, 3456, 44568, 78356
46245, 123, 3432456, 123488976, 23564, 334
46245, 123, 3432456, 123488976, 23564, 334
4

2 に答える 2

4

データベースを使用する

他の人が述べたように、最も簡単な方法は、おそらくこれを db にダンプすることです (例: sqllite)。言語とのインターフェースが必要な場合は、Python バインディングを使用できます。

純粋な Python ソリューション

fulltaxaの各エントリを完全に読み取ります(ネストの順序のため)。最初にすべてのクエリをキャッシュし、次に一度だけ読み取り、出力を並べ替えて順序を取り戻すfilltaxlist方が効率的です。fulltaxafulltaxa

クエリの順序はインポートであるため、FIFO 構造を使用する必要があります。この場合、dequeがうまく機能します。

from collections import defaultdict
filltaxlist = open("file with query number.txt", "rw")
fulltaxa = open("output file with hit line match", "rw")

possibles = {}
for i, line in enumerate(filltaxalist):
    line = line.strip()
    taxid = re.split("\t", line)
    lookup = taxid[5] # this value is a number and I need the exact match only so I covert it to an integer
    int1 = int(lookup)
    possibles[int1] = i

output_lines = defaultdict(list)
for line in open("File to search.txt", "r"):
    data = re.split(',', line)
    hit = int(data[0]) # every value in this file is a number separated by a ,
    if hit in possibles:
        output_lines[possibles[hit]].append(line)

fulltaxa.writelines(line for lines in output_lines.values() for line in lines)

クエリが不足すると、上記のコードは IndexError をスローします

その他のマイナーな改善。

data = re.split(',', line)

おそらくより遅いです

data = line.split(',')

ただし、これがあなたの場合に意味があることを確認するためにプロファイルする必要があります。

于 2013-06-08T19:07:50.470 に答える