您可能在使用错误的工具进行此任务。如果您想要持久化大量索引数据,我强烈建议使用SQLite on-disk数据库(或者当然,只是普通数据库),并使用像SQLObject或SQLAlchemy这样的ORM。
这些将处理繁琐的事情,如兼容性,优化格式以用于目的,并且不会同时将所有数据保存在内存中,以便您不会耗尽内存...
补充:因为我正在处理几乎相同的事情,但主要是因为我是一个好人,所以这里有一个演示似乎可以做到您所需的事情(它将在当前目录中创建一个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
Document.createTable()
Location.createTable()
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)
locs_for_two = Location.selectBy(dbWord = 'two')
print "Word 'two' found at..."
for loc in locs_for_two:
print "Found: %s, p%s" % (loc.dbDocument.dbName, loc.dbLocation)
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”表可能可以作为一个单独的表,具有一些用于索引和唯一性的附加设置。