我在Python中使用擱置來處理不適合內存的巨大字典,以及實現持久性。擱置使用的控制內存
運行我的代碼時,需要經常檢索並插入到字典中的隨機位置,我注意到擱置只使用4GB可用內存的3%。這會導致我的代碼運行速度變慢,因爲所需的磁盤讀/寫次數會更多。
是否有任何方法使擱置使用更多的可用內存(比如〜50%),以便內存中的命中數更高?
我在Python中使用擱置來處理不適合內存的巨大字典,以及實現持久性。擱置使用的控制內存
運行我的代碼時,需要經常檢索並插入到字典中的隨機位置,我注意到擱置只使用4GB可用內存的3%。這會導致我的代碼運行速度變慢,因爲所需的磁盤讀/寫次數會更多。
是否有任何方法使擱置使用更多的可用內存(比如〜50%),以便內存中的命中數更高?
考慮與Python很好集成的ZODB或其他鍵值存儲。任何可以擱置/醃製的物體都可以進入ZODB。擱架模塊似乎不是爲了這種性能或一致性而設計的。
http://www.ibm.com/developerworks/aix/library/au-zodb/
你也可以去一個SQL的解決方案,與泡菜模塊序列化/反序列化該對象和文本。這是Shelve和ZODB的核心。如果你感覺真的很冒險,你可以嘗試使用內存中的SQLite數據庫。 SQLite捆綁在Python中。
我也強烈推薦ZODB。您可以將您的貨架數據庫移植到ZODB數據庫中,如下所示:
#!/usr/bin/env python
import shelve
import ZODB, ZODB.FileStorage
import transaction
from optparse import OptionParser
import os
import sys
import re
reload(sys)
sys.setdefaultencoding("utf-8")
parser = OptionParser()
parser.add_option("-o", "--output", dest = "out_file", default = False, help ="original shelve database filename")
parser.add_option("-i", "--input", dest = "in_file", default = False, help ="new zodb database filename")
parser.set_defaults()
options, args = parser.parse_args()
if options.in_file == False or options.out_file == False :
print "Need input and output database filenames"
exit(1)
db = shelve.open(options.in_file, writeback=True)
zstorage = ZODB.FileStorage.FileStorage(options.out_file)
zdb = ZODB.DB(zstorage)
zconnection = zdb.open()
newdb = zconnection.root()
for key, value in db.iteritems() :
print "Copying key: " + str(key)
newdb[key] = value
transaction.commit()
如何使用某些數據庫? – DrTyrsa
是的,可能。我在考慮MongoDB,因爲它具有JSON支持。更好的主意,是嗎? – Arun
當然。爲什麼MongoDB(或其他)開發人員已經非常有效地完成這些任務時,爲什麼要浪費你的時間來管理內存。 – DrTyrsa