2011-09-23 26 views
1

我在Python中使用擱置來處理不適合內存的巨大字典,以及實現持久性。擱置使用的控制內存

運行我的代碼時,需要經常檢索並插入到字典中的隨機位置,我注意到擱置只使用4GB可用內存的3%。這會導致我的代碼運行速度變慢,因爲所需的磁盤讀/寫次數會更多。

是否有任何方法使擱置使用更多的可用內存(比如〜50%),以便內存中的命中數更高?

+0

如何使用某些數據庫? – DrTyrsa

+0

是的,可能。我在考慮MongoDB,因爲它具有JSON支持。更好的主意,是嗎? – Arun

+0

當然。爲什麼MongoDB(或其他)開發人員已經非常有效地完成這些任務時,爲什麼要浪費你的時間來管理內存。 – DrTyrsa

回答

0

考慮與Python很好集成的ZODB或其他鍵值存儲。任何可以擱置/醃製的物體都可以進入ZODB。擱架模塊似乎不是爲了這種性能或一致性而設計的。

http://www.ibm.com/developerworks/aix/library/au-zodb/

你也可以去一個SQL的解決方案,與泡菜模塊序列化/反序列化該對象和文本。這是Shelve和ZODB的核心。如果你感覺真的很冒險,你可以嘗試使用內存中的SQLite數據庫。 SQLite捆綁在Python中。

0

我也強烈推薦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()