【问题标题】:It appears I've run out of 32-bit address space. What are my options?看来我已经用完了 32 位地址空间。我有哪些选择?
【发布时间】:2012-01-07 05:36:33
【问题描述】:

我正在尝试使用numpy.cov 获取大型矩阵的协方差。我收到以下错误:

Python(22498,0xa02e3720) malloc: *** mmap(size=1340379136) 失败(错误代码=12) *** 错误:无法分配区域 *** 在 malloc_error_break 中设置断点进行调试 处理 Python 总线错误

似乎这对于 32 位机器/构建并不少见(我有一个 64 位 mac os x 10.5,但是使用 32 位 python 和 numpy 构建,因为我在构建 numpy+scipy+matplotlib 时遇到了麻烦) 64 位安装)。

那么在这一点上,如果不更换机器(目前我无法使用其他机器),那么推荐的行动方案是什么,可以让我继续进行分析?导出到 fortran/C?有一个简单的(r)解决方案吗?感谢您的建议。

【问题讨论】:

  • 您是否要映射超过 4GiB 的数据?
  • 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 协方差矩阵。分片处理数据没什么大不了的……

标签: python numpy bigdata


【解决方案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 )

如果仍然无法正常工作,请尝试为您的数据设置“良好”的 dtype。 numpy 接缝默认使用 'int64' 的 dtype 'float64'。这是巨大的,如果您不需要这种精度,您可能希望将其减少到 'int32' 或 'float32'。

import numpy
M = numpy.array([[1,2],[3,4]] , dtype.float32 )

确实,我可以向您保证,C/Fortran 不适合您。 Numpy 已经用 C/Fortran 编写,而且可能是由比你我更聪明的人编写的;)

好奇,你的矩阵有多大?你腌制的文件有多大?

【讨论】:

  • 我用来获取协方差矩阵的矩阵只有 60MB,但由于它是 1500x4 并且使用rowvar=True,它试图创建 1500x1500 矩阵,我猜这是问题所在。无论如何,我需要rowvar=False 才能得到我想要的……
  • 但仍然是一个有趣的问题;我考虑将表导出到文件中,然后在 Fortran 中逐元素计算协方差矩阵的元素,并在计算时导出它们,这样大数组就不必一次保留在内存中(所以我认为这个直接在 Fortran 中执行此操作将是一个优势,但我想我也可以在 Python 中执行此操作)。
  • 降低精度也是一个有趣的选择。
猜你喜欢
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2022-02-22
  • 1970-01-01
  • 2012-01-22
相关资源
最近更新 更多