이전 방법은 gdbm 모듈과 같은 간단한 키/값 데이터 테이블을 사용하는 것입니다. 파이썬은 그것을 지원하지만, 그것은 내 기계에 기본 파이썬 설치로 내장되어 있지 않습니다.
일반적으로 SQLite를 사용하십시오. 다른 사람들이 썼 듯이, 파이썬은 표준으로 제공되며 이미 많은 임베디드 시스템에서 사용됩니다.
레코드가 고정 길이이면 bisect 모듈을 사용할 수 있습니다. 파일 크기/레코드 크기는 파일의 레코드 수를 제공합니다. bisect 검색은 파일에서 O (log (n)) 검색을 수행하며, 동등성을 테스트하기 위해 어댑터를 작성해야합니다. 나는 그것을 테스트하지 않았습니다 있지만, 여기 스케치입니다 : 당신은 추가로 파일을 gzip을하고 gzip'ped 파일을 추구 할 수
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))
,하지만 테스트해야 시간 대 공간에 대한 트레이드 오프의 .
SQLite는 내가 필요한 것보다 훨씬 많은 기능을 가지고 있습니다. 또한, 나는 데이터를 저장할 수있는 콤팩트 모르겠지만 ... 아마도 누군가가 그걸 밝힐 수 있습니까? –
@Stephen Potter, SQLite는 네이티브, 적절하게 컴팩트, 손상되기 어렵지만 표준, 확장 가능 및 빠릅니다. 그것은 평범한 파일보다 견고하고 자신이 굴리는 것보다 더 효율적이고 쉬운 것 같습니다. SQLite는 원할하게 잘 수행됩니다. –
SQLite에 대한 약간의 편견이 있었지만 그 이유는 확실하지 않지만 필자가 수행 한 일부 테스트의 결과에 놀랐습니다. 아직 실제 테스트를 조금 더 할 필요가 있지만 실행 가능한 옵션처럼 보입니다. –