2009-08-26 2 views
1

ZODB를 사용하여 지속성을 위해 메모리에 존재하는 일부 데이터를 저장하고 있습니다. 메모리에있는 데이터가 모두 충돌하는 서비스가 다시 시작되면 MySQL 데이터베이스에서 수천 개의 행을 쿼리하는 것이 아니라 ZODB에서 데이터를로드합니다.Python : ZODB 파일 크기가 커짐 - 업데이트하지 않습니까?

데이터베이스 파일에 500K의 데이터를 저장할 때마다 내 .fs 파일이 500K가 아닌 500K로 증가하는 것으로 보입니다. 예를 들면 다음과 같습니다.

storage  = FileStorage.FileStorage(MY_PATH) 
db   = DB(storage) 
connection = db.open() 
root  = connection.root() 

if not root.has_key('data_db'): 
    root['data_db'] = OOBTree() 
mydictionary = {'some dictionary with 500K of data'} 
root['data_db'] = mydictionary 
root._p_changed = 1 
transaction.commit() 
transaction.abort() 
connection.close() 
db.close() 
storage.close() 

root [ 'data_db']의 데이터를 mydictionary의 현재 값으로 계속 덮어 쓰고 싶습니다. len (root [ 'data_db'])을 인쇄하면 mydictionary에서 올바른 수의 항목이 항상 인쇄되지만이 코드가 실행될 때마다 (동일한 정확한 데이터로) 파일 크기가 데이터 크기 (이 경우 500K)만큼 증가합니다.

여기 뭔가 잘못 되었나요?

답변

2

ZODB의 데이터가 변경되면 파일의 끝에 추가됩니다. 오래된 데이터가 남아 있습니다. 파일 크기를 줄이려면 데이터베이스를 수동으로 "압축"해야합니다.

Google은 this mailing list post으로 나타났습니다.

+1

매번 저장 한 데이터를 덮어 쓰고 싶기 때문에 추천 할만한 다른 저장 시스템 (파이썬에 기본이있을 수 있음)이 있습니까? Pickly는 나를 위해 일할 것이지만 트랜잭션이 거대한 데이터 세트 (사전에 1M + 항목)가있을 때 느린 것처럼 보입니다 – sberry

+0

Mark와 마찬가지로 sqlite를 고려할 것입니다. –

1

댓글에서 다른 스토리지 시스템에 관해 질문했기 때문에 SQLite를 살펴볼 수 있습니다.

SQLite가 데이터를 처음 추가하는 경우에도 동일한 동작을 수행하지만 사용되지 않는 저장 공간을 복구하는 vacuum 명령을 제공합니다. Python API에서 vacuum pragma을 사용하여 자동으로 처리하거나 the vacuum command을 실행할 수 있습니다.

+0

음. SQLite가 항상 데이터베이스 파일의 크기를 늘리는 것은 아닙니다. 비워진 페이지가 재사용됩니다. 'vacuum' 명령을 실행하지 않으면 파일이 축소되지 않습니다. – tzot