我已经开始使用需要存储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 个) 。显然,对于不同的对象,数字每次都会不同,但在我的代码中,我只是选择了一些随机输入的数字。14784
1830
我觉得并不奇怪的是,它在带有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))
尽管必须存储大量数据,但它仍然有效。