代码可读性-Python Shelve模块内存消耗



我被分配了读取一个.txt文件的任务,该文件是各种事件的日志,并将其中一些事件写入字典。

问题是文件的大小有时会超过3GB。这意味着字典变得太大,无法放入主内存。看来Shelve是解决这个问题的好方法。但是,由于我将不断修改字典,因此必须启用writeback选项。这就是我担心的地方——教程说这会减慢读/写过程并使用更多内存,但我找不到速度和内存如何受到影响的统计数据。

有人能澄清读/写速度和内存受到了多大的影响吗?这样我就可以决定是使用写回选项,还是牺牲一些可读性来提高代码效率?

感谢

对于这种大小的数据库,搁置确实是错误的工具。如果您不需要高度可用的客户端/服务器架构,并且只想将TXT文件转换为本地内存可访问的数据库,那么您真的应该使用ZODB

如果您需要高度可用的数据库,当然需要切换到正式的"NoSQL"数据库,其中有许多数据库可供选择。

下面是一个简单的示例,说明如何将搁置数据库转换为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() 

最新更新