古い方法は、gdbmモジュールのような単純なキー/値データテーブルを使用することです。Pythonにはそのサポートが付属していますが、私のマシンのデフォルトのPythonインストールには組み込まれていません。
一般的に、SQLiteを使用します。他の人が書いたように、それはPythonに標準で付属しており、すでに多くの組み込みシステムで使用されています。
レコードが固定長の場合は、bisectモジュールを使用できます。ファイルサイズ/レコードサイズは、ファイル内のレコード数を示します。バイセクト検索では、ファイル内でO(log(n))ルックアップが実行されるため、同等性をテストするためのアダプターを作成する必要があります。私はそれをテストしていませんが、ここにスケッチがあります:
import bisect
RECORD_SIZE = 50
class MatchFirst10Chars(object):
def __init__(self, word):
self.word = word
def __lt__(self, other):
return self.word < other[:10]
class FileLookup(object):
def __init__(self, f):
self.f = f
f.seek(0, 2)
self.size = f.tell() // RECORD_SIZE
def __len__(self):
return self.size
def __getitem__(self, i):
self.f.seek(i*RECORD_SIZE)
return self.f.read(RECORD_SIZE)
SKU = "123-56-89 "
f = open("data_file")
fl = FileLookup(f)
i = bisect.bisect(fl, MatchFirst10Chars(SKU))
さらにファイルをgzipで圧縮し、gzipで圧縮されたファイルを探すこともできますが、これはスペースと時間のトレードオフであり、テストする必要があります。