使用Linux上没有出现的长列表时的Python内存错误

2024-09-30 14:17:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我来处理一个相当大的模拟代码,它需要存储最多189383040个浮点数。我知道,这是一个很大的问题,但是没有什么可以克服的,比如只看一部分或者逐个处理它们。在

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

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对象在1830不同位置存储一些参数(2lists,每个长度为3,1个浮点)。显然,对于不同的对象,每次的数字都是不同的,但在我的代码中,我只选择了一些随机输入的数字。在

我并不觉得奇怪的是,它在Windows7Enterprise和HomePremium上失败了,MemoryError。即使我在一台内存为16gb的机器上运行代码,它仍然会失败,即使机器上还有足够的内存。所以第一个问题是:为什么会这样?我认为内存越多,我可以在内存中存储的东西就越多。

我在我同事的ubuntu12.04机器上运行了同样的代码(同样是16gb的RAM),结果没有问题。所以我想知道的另一件事是:我能做些什么让Windows满意这些代码吗?一、 给我的Python进程更多的堆和堆栈内存?

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

编辑

回答后我把代码改成:

^{pr2}$

尽管需要存储大量的数据,但它仍然可以工作。在


Tags: 数据对象内存代码in机器objfor
1条回答
网友
1楼 · 发布于 2024-09-30 14:17:28

在Python中,每个float都是堆上的一个对象,具有自己的引用计数等。为了存储这么多的浮点,您确实应该使用float列表的dense表示,例如numpy的{}。在

另外,由于重用相同的float对象,因此无法正确估计内存使用量。您有对同一个float对象的引用列表。在实际情况下(其中float是不同的),您的内存使用量会更高。你真的应该用ndarray。在

相关问题 更多 >

    热门问题