我来处理一个相当大的模拟代码,它需要存储最多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}$尽管需要存储大量的数据,但它仍然可以工作。在
在Python中,每个}。在
float
都是堆上的一个对象,具有自己的引用计数等。为了存储这么多的浮点,您确实应该使用float列表的dense表示,例如numpy
的{另外,由于重用相同的
float
对象,因此无法正确估计内存使用量。您有对同一个float
对象的引用列表。在实际情况下(其中float
是不同的),您的内存使用量会更高。你真的应该用ndarray
。在相关问题 更多 >
编程相关推荐