2016-05-01 7 views
1

平均文字列の長さが10-12文字で、重複する可能性があり、各文字列が異なる行にある10億文字列の巨大な平文ファイルがあります。私の仕事は、クエリ文字列が与えられたときに、文字列がファイルに存在する場合に最初に一致する行を探し出すか、 "見つからない"を返すことです。巨大な短い文字列を検索する

自然な解決策は毎回grep -m1 -n '^querystring$'を実行することです。これには約15-20秒かかりますが、これは余分なストレージを必要とせず、メモリを消費しません。これは良い解決策ですか、それとももっと良いものがありますか?

あなたはそのためのシンプルなPythonのコードを使用することができます

答えて

0

(NB目安として、私のストレージ要件:< 10ギガバイト、およびメモリ要件< 16ギガバイト):

file = 'file.txt' 
queryLine = 0 
with open(file, 'r') as f: 
    for line in f: 
     if <YOUR QUERY> in line: return queryLine 
     else: queryLine += 1 

このように、あなた代わりにgrepを使用して、一致するものを見つけるたびに、ファイル全体を調べてください。

0

はここでPythonのソリューションです:

ときopenあなたはあなたに非常にメモリが効率的である一行ずつを、与えるイテレータを取得するファイル。

def first_occurrence(filename, query): 
    with open(filename) as f: 
     filtered = (i for i, line in enumerate(f, 1) if query in line) 
     return next(filtered, 'not found') 

そのような行がありません場合は、デフォルト値'not found'が返されます。私の提案は、ファイルを列挙し、このようなあなたの基準を満たす最初の行の行を取得することです。 filtered = (...)は、ジェネレータ式を使用してジェネレータを構築します。ジェネレータはイテレータなので、この部分もメモリ効率が良いです。

関連する問題