Python 看来我';我的32位地址空间用完了。我有什么选择?

Python 看来我';我的32位地址空间用完了。我有什么选择?,python,numpy,bigdata,Python,Numpy,Bigdata,我试图使用numpy.cov获取一个大矩阵的协方差。我得到以下错误: Python(22498,0xa02e3720) malloc: *** mmap(size=1340379136) failed (error code=12) *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug Process Python bus error Python(22498,0xa02e372

我试图使用
numpy.cov
获取一个大矩阵的协方差。我得到以下错误:

Python(22498,0xa02e3720) malloc: *** mmap(size=1340379136) failed (error code=12) *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug Process Python bus error Python(22498,0xa02e3720)malloc:**mmap(大小=1340379136)失败(错误代码=12) ***错误:无法分配区域 ***在malloc\u error\u break中设置断点以进行调试 进程Python总线错误 这在32位机器/构建中似乎并不少见(我有一个64位mac os x 10.5,但使用32位python和numpy构建,因为我在64位安装上构建numpy+scipy+matplotlib时遇到了麻烦)


那么,在这一点上,如果没有转辙机(目前我没有其他可用的转辙机),我建议采取什么样的行动来继续分析?是否导出到fortran/C?有简单的(r)解决方案吗?谢谢你的建议。

为了在你的位置,我会尝试在硬盘上“pickle”(保存)矩阵,关闭python,然后在命令行中重新打开pickle文件,并在“fresh python”实例上进行计算

我会这么做,因为也许你的问题是在计算协方差之前

import cPickle
import numpy
M = numpy.array([[1,2],[3,4]]) # here it will be your matrix
cPickle( M , open( "~/M.pic", "w") ) # here it's where you pickle the file
在这里,您可以关闭python。您的文件应以“M.pic”的形式保存在主目录中

如果仍然不起作用,请尝试为数据设置“良好”的数据类型。numpy seams默认使用“int64”的数据类型“float64”。这是巨大的,如果您不需要此精度,您可能希望将其减少到“int32”或“float32”

import numpy
M = numpy.array([[1,2],[3,4]] , dtype.float32 )
事实上,我可以向您保证,C/Fortran不是您的选择。Numpy已经用C/Fortran编写,可能是比你我更聪明的人编写的;)


出于好奇,你的矩阵有多大?您的pickle文件有多大?

您是否正在尝试映射4GB以上的数据?64位是可选的,但您的问题在该大小下是否可以处理。这种大小的密集协方差矩阵表明操作将永远运行!你可能会发现64位版本的R在Mac上是稳定的。哎呀,我想不是
sys.getsizeof(x)
只给我60个字节。但是我的数组是15000 x 4,并且我没有像预期的那样使用
rowvar=False
(输入是根据R的约定进行转换的)。也许这就是错误。。。矩阵变换后,它就工作了。但这确实很奇怪。感谢您对64位Mac的建议——我倾向于认为R在内存管理方面更差(这就是为什么我在这个项目中一度切换到Python),但我完全忘记了64位的优势。R在内存管理方面并没有更差或更好。这些都被发送到BLAS或优化的BLAS实现。在我的例子中,我只是使用内存映射文件,并且很容易生成和存储20k x 20k协方差矩阵。在切片中处理数据没什么大不了的…我用来计算协方差矩阵的矩阵只有60MB,但因为它是1500x4,并且使用
rowvar=True
它试图创建1500x1500矩阵,我想这就是问题所在。无论如何,我需要
rowvar=False
来得到我想要的……但这仍然是一个有趣的问题;我考虑将表导出到一个文件中,然后用Fortran计算协方差矩阵元素,并在计算时导出它们,这样大数组就不必立即保留在内存中(因此,我认为直接在Fortran中这样做会有好处,但我想我也可以在Python中这样做。)降低精度也是一个有趣的选择。
import numpy
M = numpy.array([[1,2],[3,4]] , dtype.float32 )