似乎我的32位地址空间用完了,我有哪些选择?
我正在尝试使用 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
看起来在32位的机器或版本上,这种情况并不少见(我使用的是64位的mac os x 10.5,但因为在64位安装上构建numpy+scipy+matplotlib时遇到问题,所以使用了32位的python和numpy版本)。
那么在这种情况下,如果不换机器(目前我没有其他机器可用),我该如何继续进行分析呢?是导出到fortran/C吗?有没有更简单的解决办法?谢谢大家的建议。
1 个回答
1
如果我是你,我会尝试把这个矩阵“保存起来”(也就是“腌制”),存到我的硬盘上,然后关闭Python,再在命令行中重新打开这个保存的文件,在一个“全新的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”。
import cPickle
import numpy
M = cPickle.load( open( "~/M.pic", "r") )
M = numpy.coa( M )
如果还是不行,试着给你的数据设置一个“合适”的数据类型。Numpy默认使用的dtype是'float64'或'int64',这占用的空间很大。如果你不需要这么高的精度,可以考虑把它改成'int32'或'float32'。
import numpy
M = numpy.array([[1,2],[3,4]] , dtype.float32 )
其实,我可以肯定地告诉你,C/Fortran对你来说不是一个选项。Numpy本身就是用C/Fortran写的,而且可能是比你我更聪明的人写的;)
顺便问一下,你的矩阵有多大?你保存的文件有多大?