2009-07-21 3 views
2

현재 나는 약 5000 개의 dict 객체를 저장하기 위해 SQLite (w/SQLAlchemy)을 사용합니다. 각 dict 객체는 PyPI에서 키 - (이름, 버전, 요약, 경우에 따라 '설명'이 프로젝트 문서만큼 클 수 있음)가있는 항목에 해당합니다.파이썬을위한 빠르고 검색 가능한 dict 저장소

(JSON에서)이 항목을 디스크 (SQLite 형식)에 다시 쓰는 데 몇 초가 걸리고 느려집니다.

쓰기는 하루에 한 번 자주 수행되지만 키 (일반적으로 이름 또는 설명)를 기반으로 특정 항목을 읽거나 검색하는 작업은 매우 빈번하게 수행됩니다.

apt-get과 똑같습니다.

파이썬에서 사용할 필요가있는 스토리지 라이브러리가 SQLite보다 나은가?

+1

왜 매일 JSON에서 데이터베이스를 다시 만드나요? 삽입 코드는 어떻게 생겼습니까? 많은 데이터를 삽입하는 경우 SQLAlchemy의 ORM 계층을 피하고 삽입 식을 사용할 수 있습니다. http://www.sqlalchemy.org/docs/05/sqlexpression.html#insert-expressions –

답변

2

이름과 설명에 색인을 붙였습니까? 5000 개의 인덱싱 된 항목을 검색하는 것은 본질적으로 순간적이어야합니다 (물론 ORM을 사용하면 SQLAlchemy와 같은 상대적으로 좋은 것이지만 "원시 sqlite"를 시도하고 절대적으로 날아 가야하므로) 훨씬 힘들어집니다.

실제로 업데이트 된 항목을 쓰는 것은 기본적으로 즉각적이어야합니다. 이상적으로는 하나의 업데이트 진술이이를 수행해야하지만 이상은 실제 문제가 아니어야합니다. 단지 자동 커밋을 해제해야합니다. 루프의 시작 (나중에 다시 되돌리려면).

+0

실제로 느린 5000 항목. 그리고, 나는 본질적으로 매일 그것들을 모두 말해야 만합니다. 업데이트 된 패키지 색인을 다운로드 할 준비가 된 "apt-get update"를 생각해보십시오. –

+0

@srid, 자세한 CREATE TABLE 문을 줄 수 있습니까? 그것은 실제로 고유해야합니다 - 내 실험에서 xmlrpclib를 통해 pypi에서 정보를 얻으려면 sqlite에서 정보를 얻는 데 오랜 시간이 걸립니다. 물론 변경된 내용은 SQLite에서만 업데이트됩니다. 왜 UNINTEDED를 다시 작성해야합니까? 항목?!). –

+1

sqlite 문서에는 기본적으로 모든 개별 INSERT가 완료되고 (쓰기 및 확인) 최소 2 개의 디스크 회전을 취하는 트랜잭션임을 나타내는 주석이 있습니다. 'BEGIN..COMMIT' 블록으로 전체 작품을 감쌀 경우, 그것을 피하고 훨씬 더 빠른 처리량을 얻을 수 있습니다 - http://www.sqlite.org/atomiccommit.html & http://www.sqlite.org/speed .html – warren

1

응용 프로그램에는 과도한 사용이 될 수 있지만 스키마가없는/문서 지향 데이터베이스를 체크 아웃해야합니다. 개인적으로 나는 couchdb의 팬입니다. 기본적으로 테이블에 레코드를 레코드로 저장하는 대신 couchdb는 키 - 값 쌍을 저장 한 다음 (couchdb의 경우) 자바 스크립트에서 뷰를 작성하여 필요한 데이터를 제거합니다. 이러한 데이터베이스는 일반적으로 관계형 데이터베이스보다 확장이 쉽고, 관계형 데이터베이스에 적합한 모양으로 데이터를 망칠 필요가 없기 때문에 훨씬 빠릅니다. 반면에 다른 서비스가 실행 중임을 의미합니다.

+0

예, couchdb는 본질적으로 독립 실행 형 명령 줄 응용 프로그램에 대한 과잉 공격입니다. :-) –

+0

CouchDB는 내가 좋아하는 데이터 저장소가 아니지만, 과장이라고 생각하지 않습니다. 자체 내장 또는 임베디드 시스템 (예 : http://www.couchone.com/android)에 선호되는 옵션 인 것 같습니다. –

+0

몽고 는 반면에 C 컴파일 된 JSON 확장과 매우 ​​빠른 기본 비 트랜잭션 데이터 저장소를 가지고 있습니다. 그러나 특별한 사용자처럼 별도의 프로세스를 실행하는 것이 매우 바람직하므로 설치 오버 헤드가 더 많이 발생합니다. –

0

명시된 개체의 수 (약 5,000 개)를 감안할 때 SQLite는 속도면에서 문제가되지 않을 가능성이 높습니다. 그것은 중개 방책입니다. 예를 들어 JSON 또는 SQLAlChemy의 비 최적 사용.

이 밖으로 시도 (상당히 빠른 심지어 백만 객체) : SQLite는

"직렬화 + 지속성 : 몇 줄의 코드에, 압축 및 주석 파이썬 객체와 y_serial.py 모듈 : : 창고 파이썬 객체 나중에 SQL을 사용하지 않고 키워드로 시간순으로 검색 할 수 있습니다. 스키마가없는 데이터를 저장하는 가장 유용한 "표준"모듈입니다. " 당신의 키에 대한

http://yserial.sourceforge.net

yserial 검색 는 SQLite는 측면이 아닌 파이썬에서 정규 표현식 ("정규식") 코드를 사용하여 수행됩니다, 그래서 다른 상당한 속도 향상이있다.

어떻게 작동되는지 알려주십시오.

0

지금 당장은 Nucular을 사용하여 나 자신과 비슷한 문제를 해결하고 있습니다. 그것은 파일 시스템 기반의 저장 장치이며 실제로 매우 빠릅니다. (indexes the whole python source tree 예제 응용 프로그램과 함께 제공됩니다.) 동시 안전하며 외부 라이브러리가 필요없고 순수한 파이썬입니다.그것은 빠르게 검색하고 유행 Couchdb와 mongodb의 방식을 따르는 전문화 된, 진행중인 원시 python-dict 저장소의 일종이지만 훨씬 가벼운 강력한 전문 검색, 색인 작성 등을 제공합니다.

중첩 된 사전을 저장하거나 쿼리 할 수 ​​없으므로 모든 JSON 유형을 저장할 수있는 것은 아닙니다. 게다가 텍스트 검색은 강력하지만 숫자 쿼리는 약하고 인덱스가 없습니다. 그럼에도 불구하고 그것은 정확하게 당신이 쫓고있는 것일 수 있습니다.

관련 문제