我有存储在DB一些数据,我想过程。 DB访问是非常缓慢的,所以我决定任何处理之前加载在字典中的所有数据。然而,由于存储的数据的规模庞大,我得到一个内存不足的错误(我见多使用2场演出)。所以,我决定用一个磁盘数据结构,并发现使用货架是一种选择。这是我做的(伪Python代码)

def loadData():
    if (#dict exists on disk):
        d = shelve.open(name)
        return d
    else:
        d = shelve.open(name, writeback=True)
        #access DB and write data to dict
        # d[key] = value 
        # or for mutable values
        # oldValue = d[key]
        # newValue = f(oldValue)
        # d[key] = newValue 
        d.close()
        d = shelve.open(name, writeback=True)
        return d

我有几个问题,

1)我真的需要写回=真?它有什么作用?

2)我仍然得到内存溢出的例外,因为我不运动,当数据被写入到磁盘上的任何控制。我怎么做?我试图做一个同步()每次迭代次数很少,但是这并没有帮助。

谢谢!

有帮助吗?

解决方案

writeback=True力架,以保持在内存中的任何项目不断进账,并把它们写回当小桌被关闭。因此,它消耗更多的存储器,并且减慢关闭。

参数的优势在于,有了它,你的不要需要你在可变项,它们的突变基因您的评论显示扭曲的代码是一个方法 - 只要

shelf['foobar'].append(23)

作品(如果shelf与回写使能打开),在关键'foobar'假设该项目过程中的列表,而它会静静地是一个无操作(保留在磁盘上保持不变的项目),如果shelf在没有回写打开 - - 在后一种情况下,你实际做必要的代码

thelist = shelf['foobar']
thelist.append(23)
shekf['foobar'] = thelist

在您的评论的精神 - 这是风格上多少有些令人失望的

不过,既然你的的有记忆问题,我肯定会推荐的不可以使用该可疑写回选项。我想我可以把它称为“可疑”,因为我是第一个提出并实施第一次,但是那是很多年前了,我主要是后悔做这件事的 - 它比它更GENERALES混乱(如您的问与答证据)允许优雅和轻便在移动原始写入到工作与http://stardict.sourceforge.net/Dictionaries.php下载代码(这将使用第一成语,而不是第二,因此需要为了改写为可使用带搁板无回溯)。不错啊,对不起,它的没有的似乎是个好主意的时候。

其他提示

使用sqlite3模块可能是这里的最佳选择。你也许可以在内存反正源码完全使用,因为它的内存占用量可能比使用python对象反正有点小。它通常比使用shelve反正一个更好的选择; shelve用途pickle之下,这是很少你想要的。

地狱,你可以只转换你的整个现有的数据库SQLite数据库。 SQLite是很好,速度很快。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top