您可能正在爲此作業使用錯誤的工具。如果你想要保存大量的索引數據,我強烈建議使用帶有ORM(如SQLObject或SQL Alchemy)的SQLite磁盤數據庫(或者當然,只是一個普通的數據庫)。
這些會照顧像兼容性平凡的事情,優化目的格式,而不是在內存同時按住所有的數據,讓你耗盡內存...
補充:因爲我是無論如何,我的工作基本上是完全相同的,但主要是因爲我是一個很好的人,這裏有一個演示程序,它可以滿足您的需求(它會在您當前的目錄中創建一個SQLite文件,如果有文件名稱已經存在,所以把它放在空的第一個地方):
import sqlobject
from sqlobject import SQLObject, UnicodeCol, ForeignKey, IntCol, SQLMultipleJoin
import os
DB_NAME = "mydb"
ENCODING = "utf8"
class Document(SQLObject):
dbName = UnicodeCol(dbEncoding=ENCODING)
class Location(SQLObject):
""" Location of each individual occurrence of a word within a document.
"""
dbWord = UnicodeCol(dbEncoding=ENCODING)
dbDocument = ForeignKey('Document')
dbLocation = IntCol()
TEST_DATA = {
'one' : {
'doc1' : [1,2,10],
'doc3' : [6],
},
'two' : {
'doc1' : [2, 13],
'doc2' : [5,6,7],
},
'three' : {
'doc3' : [1],
},
}
if __name__ == "__main__":
db_filename = os.path.abspath(DB_NAME)
if os.path.exists(db_filename):
os.unlink(db_filename)
connection = sqlobject.connectionForURI("sqlite:%s" % (db_filename))
sqlobject.sqlhub.processConnection = connection
# Create the tables
Document.createTable()
Location.createTable()
# Import the dict data:
for word, locs in TEST_DATA.items():
for doc, indices in locs.items():
sql_doc = Document(dbName=doc)
for index in indices:
Location(dbWord=word, dbDocument=sql_doc, dbLocation=index)
# Let's check out the data... where can we find 'two'?
locs_for_two = Location.selectBy(dbWord = 'two')
# Or...
# locs_for_two = Location.select(Location.q.dbWord == 'two')
print "Word 'two' found at..."
for loc in locs_for_two:
print "Found: %s, p%s" % (loc.dbDocument.dbName, loc.dbLocation)
# What documents have 'one' in them?
docs_with_one = Location.selectBy(dbWord = 'one').throughTo.dbDocument
print
print "Word 'one' found in documents..."
for doc in docs_with_one:
print "Found: %s" % doc.dbName
這是證書唯一不是唯一的方式(或者必然是最好的方式)做到這一點。文檔或Word表格是否應與地點表格分開,取決於您的數據和典型用途。在你的情況下,「Word」表可能可能是一個單獨的表,其中有一些額外的索引和唯一性設置。
工作就像一個魅力。令人難以置信的簡單修復 - 基本上只是將「pickle」改爲「marshal」並完成了。我沒有意識到cPickle執行週期檢測。通過使用元帥,寫入磁盤需要幾秒鐘的時間,而不是20分鐘,內存消耗從30%降低到幾乎0%。謝謝! –
簡單的解決方案加上簡潔的解釋,100%真棒。 – mitchus
很高興知道,謝謝@gnibbler! –