似乎我的32位地址空间用完了,我有哪些选择?

10 投票
1 回答
1110 浏览
提问于 2025-04-17 07:09

我正在尝试使用 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写的,而且可能是比你我更聪明的人写的;)

顺便问一下,你的矩阵有多大?你保存的文件有多大?

撰写回答