gpt4 book ai didi

Python搁置OutOfMemory错误

转载 作者:行者123 更新时间:2023-11-28 19:59:56 24 4
gpt4 key购买 nike

我有一些数据存储在我想要处理的数据库中。数据库访问非常慢,所以我决定在任何处理之前将所有数据加载到字典中。但是,由于存储的数据量巨大,我遇到内存不足错误(我看到使用了超过 2 个演出)。所以我决定使用磁盘数据结构,并发现使用 shelve 是一种选择。这是我所做的(伪 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) 我真的需要 writeBack=True 吗?它有什么作用?

2) 我仍然遇到 OutofMemory 异常,因为我没有对数据写入磁盘的时间进行任何控制。我怎么做?我尝试每隔几次迭代执行一次 sync(),但这也无济于事。

谢谢!

最佳答案

writeback=True 强制 shelf 将曾经获取的任何项目保存在内存中,并在 shelf 关闭时将它们写回。因此,它会消耗更多内存,并减慢关闭速度。

参数的优点是,有了它,您不需要在评论中显示的扭曲代码,用于可变项的修改器是一个方法——只需

shelf['foobar'].append(23)

有效(如果 shelf 打开并启用回写),假设键 'foobar' 处的项目当然是一个列表,虽然它会默默地是一个 no-如果 shelf 打开时没有写回,则操作(保留磁盘上的项目不变)——在后一种情况下,您实际上确实需要编码

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

按照您评论的精神——这在风格上有点令人失望。

但是,由于您有内存问题,我绝对建议不要使用这个可疑的回写选项。我想我可以称它为“可疑的”,因为我是第一个提出并实现它的人,但那是很多年前的事了,而且我大部分时间都后悔这样做了——它比它更让人困惑(正如你的 Q 证据)允许优雅和方便地移动最初编写的与字典一起使用的代码(它将使用第一个习语,而不是第二个,因此需要重写以便在没有回溯的情况下与货架一起使用)。嗯,抱歉,当时确实看起来是个好主意。

关于Python搁置OutOfMemory错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2196969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com