2013-08-05 8 views
1

저의 목표는 MD5 해시 데이터베이스를 생성 한 다음 다른 해시 목록을 검사하여 데이터베이스에 있는지 확인하는 것입니다.sqlite with Python은 anydbm에 비해 부당하게 느립니다.

anydbm을 사용하는 실제 해결책이 있는데, 익숙하지 않은 경우 파이썬에서 사전과 정확히 똑같이 작동하지만 메모리에 모든 것을 한꺼번에로드 할 필요는 없습니다. db의 생성은 다소 느리고 (대략 2 시간 반 동안 1 억 항목) 검색 속도는 중간 정도 (1 ~ 2 초에 100000 항목)입니다. 해시가 존재하는지 확인하는 것은 if hash in dbm처럼 간단합니다.

성능 향상을 위해 sqlite로 작업 솔루션을 만들려고했습니다. 생성 속도가 빠르게 빨라져서 1 억 개의 항목이 모두 수 분 내에 생성됩니다. 그러나 검색은 한 항목에 대해 15 초 이상 걸렸다.. 이것은 부당합니다!

나는 SQL 전문가가 아니므로 지나치게 복잡하게 만드는 명령을 사용하고 있는지 궁금합니다.

다음과 같이 그들은 : (루프)에 c.execute('''create table keys(id integer not null primary key autoincrement, hash text, alert text) ''')

추가 항목 : 테이블의

생성 c.execute('''insert into keys(hash, alert) values (?,?) ''', (hash, "1"))

검색 (또한 루프) : 당신이

c.execute('''select * from keys where hash = ? ''', (hash,)) 
hits = c.fetchall() 
numhits += len(hits) 
+2

sqlite는 성능 향상을 목적으로하지 않습니다. –

+7

[Index your hash column.] (http://www.sqlite.org/lang_createindex.html) – Carsten

+3

인덱스가 지정되지 않은 고유하지 않은 필드에서'select *'를 사용하면 데이터베이스가 쿼리 된 테이블 인 반면, 사전 /'anydbm' 키와 같은 고유 키를 가진 해시 기반 조회 : 값 저장소는 각 키를 한 번만 저장하므로 1 개의 레코드 만 찾아야합니다. @Carsten이 말했듯이 색인을 사용하여 쿼리를 더 빠르게 만들 필요가 있습니다 (가능한 경우 고유 한 제약 조건을 추가하는 것을 고려하십시오). – mdscruggs

답변

4

을 md5 테이블에 인덱스를 생성합니다 - 해시가 고유하지 않은지 여부와 관계 없음 - 인덱스가없는 경우 선형 액세스는 모든 레코드를 전자 메일로 전송 함을 의미합니다. 액세스.

문서를 보면 인덱스를 만드는 것이 데이터베이스에 CREATE INDEX hash ON keys (hash)을 발행하는 것처럼 쉽습니다.