Python的货架内存不足错误
-
25-09-2019 - |
题
我有存储在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是很好,速度很快。