gpt4 book ai didi

使用 Linux 上不会发生的长列表时的 Python MemoryError

转载 作者:可可西里 更新时间:2023-11-01 10:37:05 27 4
gpt4 key购买 nike

我开始使用一个相当大的模拟代码,它需要存储多达 189383040 个 float 。我知道,这很大,但没有太多办法可以解决这个问题,比如只查看其中的一部分或一个接一个地处理它们。

我写了一个简短的脚本,它重现了错误,所以我可以在不同的环境中快速测试它:

noSnapshots = 1830
noObjects = 14784

objectsDict={}

for obj in range(0, noObjects):
objectsDict[obj]=[[],[],[]]
for snapshot in range(0,noSnapshots):
objectsDict[obj][0].append([1.232143454,1.232143454,1.232143454])
objectsDict[obj][1].append([1.232143454,1.232143454,1.232143454])
objectsDict[obj][2].append(1.232143454)

它表示实际代码的结构,其中必须为每个 14784 对象存储一些参数(2 个列表,每个长度为 3 和 1 个 float ) 1830 不同的位置。显然,对于不同的对象,数字每次都会不同,但在我的代码中,我只是选择了一些随机输入的数字。

我发现这并不奇怪,它在 Windows 7 Enterprise 和 Home Premium 上失败并出现 MemoryError。即使我在具有 16 GB RAM 的机器上运行代码,它仍然会失败,即使机器上仍然有足够的内存。所以第一个问题是:为什么会这样?我想我拥有的 RAM 越多,我可以在内存中存储的东西就越多。

我在我同事的 Ubuntu 12.04 机器上运行了相同的代码(同样有 16 GB 的 RAM)并且它没有问题地完成。所以我想知道的另一件事是:我可以做些什么来让 Windows 对这段代码感到满意吗? IE。为我的 Python 进程提供更多堆和堆栈内存?

最后:对于如何以类似于示例代码中的方式在内存中存储大量数据,有没有人有任何建议?

编辑

回答后我将代码更改为:

import numpy

noSnapshots = 1830
noObjects = int(14784*1.3)

objectsDict={}

for obj in range(0, noObjects):
objectsDict[obj]=[[],[],[]]

objectsDict[obj][0].append(numpy.random.rand(noSnapshots,3))
objectsDict[obj][1].append(numpy.random.rand(noSnapshots,3))
objectsDict[obj][2].append(numpy.random.rand(noSnapshots,1))

尽管必须存储大量数据,但它仍能正常工作。

最佳答案

在 Python 中,每个 float 都是堆上的一个对象,有自己的引用计数等。要存储这么多 float ,你真的应该使用 dense float 列表的表示,例如 numpyndarray

此外,因为您正在重复使用相同的 float 对象,所以您没有正确估计内存使用情况。您有对同一个 float 对象的引用列表。在真实情况下(float 不同)您的内存使用量会高得多。你真的应该使用 ndarray

关于使用 Linux 上不会发生的长列表时的 Python MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19543719/

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