2

我已经开始使用需要存储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)

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

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

我在同事的 Ubuntu 12.04 机器上运行了相同的代码(同样是 16 GB 的 RAM),它完成了没有问题。所以我想知道的另一件事是:我能做些什么来让 Windows 对这段代码感到满意吗?即在堆和堆栈上给我的 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))

尽管必须存储大量数据,但它仍然有效。

4

1 回答 1

1

在 Python 中,everyfloat是堆上的一个对象,具有自己的引用计数等。为了存储这么多浮点数,您真的应该使用浮点数列表的密集表示,例如numpy's ndarray

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

于 2013-10-23T14:10:16.607 回答