【发布时间】:2013-11-01 20:22:55
【问题描述】:
我开始使用一个相当大的模拟代码,它需要存储多达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)
它表示实际代码的结构,其中必须为1830 不同位置的每个14784 对象存储一些参数(2 个lists,每个长度为3,1 个浮点数)。显然,对于不同的对象,每次的数字都会不同,但在我的代码中,我只是选择了一些随机输入的数字。
我觉得并不奇怪的是,它在 Windows 7 企业版和家庭高级版上失败,并带有 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))
尽管需要存储大量数据,但它仍然有效。
【问题讨论】:
-
您是否在 Windows 上使用 64 位版本的 Python?
-
好点。它是 32b Windows 和 64b Linux。
-
这将 Windows 可用的 RAM 限制为 4GB。
-
@Max 在使用 64b Python 时可以增加这个限制吗?还是升级到 Python 3.X?
-
@AleksanderLidtke:在 Windows 上?请参阅:msdn.microsoft.com/en-us/library/aa366778.aspx。对于 x86(32 位)上的 Windows 7,整个操作系统只能访问 4 GB 的 RAM。 Python 无法再访问了。
标签: python linux windows python-2.7 memory-management