【问题标题】:memory-mapping in python using numpy errorpython中的内存映射使用numpy错误
【发布时间】:2013-07-15 19:49:05
【问题描述】:
OUT_DIR = '/media/sf_3dAnalysis/simMatrix/'  
SIM_FILE = 'similarity.npy'

data = np.lib.format.open_memmap(OUT_DIR+SIM_FILE, mode='w+', dtype='float32', shape=(len(filelist),len(filelist)))
del data

所以我在运行此代码时收到以下错误消息... mmap.error: [Errno 22] Invalid argument。我真的不明白我做错了什么。如果相关的话,我会在 Linux VM 中运行它。此外,特别奇怪的是矩阵是在代码运行后创建的,但它仍然会崩溃,说参数无效,这对于为什么当它说参数无效时创建矩阵是没有意义的。

为了让内存映射在 linux 机器上而不是 windows 和 mac 上工作,我需要做些什么特别的事情吗?因为它在我的 mac 和 windows 机器上运行良好。我想我应该指定更多,是否需要在虚拟机中设置一些设置或某些东西才能使内存映射正常工作?因为我在一台正常运行Linux的电脑上试了一下,果然成功了。

【问题讨论】:

  • 文件有多大?你是在虚拟机中创建的还是导入的?虚拟机的规格是什么?
  • 文件大约 60 GB,在虚拟管理器中创建。我不知道你说的虚拟机规格是什么意思?
  • 哎呀,这是一个错字。对不起。确切的形状是我认为不是特别相关的文件列表的长度。但我想可能是这样。 shape = (len(filelist), len(filelist)) 是确切的陈述。
  • 对不起,我应该注意 len(filelist) 是 120821
  • 好的,shape=(120821, 120821) 将创建一个 60GB 的矩阵/文件。

标签: python numpy memory-mapping


【解决方案1】:

我无法使用上面给出的示例复制您的错误。

mmap.error: [Errno 22] Invalid argument 是对 libc 的低级调用的错误代码 mmap 例程请参阅 http://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html

mmap 返回新映射的地址,或 -1 表示错误。

可能的错误包括:

EINVAL 地址不可用,或者给出的标志不一致。

我猜这是内存不足的情况,因为您尝试分配的块太大,不适合 VM 虚拟内存空间。

【讨论】:

  • 内存不足是什么意思?就像硬盘驱动器内存不足?还是电脑的虚拟内存用完了?
  • 我还能做些什么来修复它?
  • 那么我应该为VM分配更多的虚拟内存空间吗?
  • 如何解决:你真的需要一个 120000x120000 float32 矩阵吗?这是一个巨大的数据结构......如果可能的话,我会尝试拆分对该矩阵的较小块的访问,并放弃使用.npy 格式的想法。它更灵活,但可能不太适合如此大的矩阵。直接使用np.memmap,使用offset != 0 访问文件的某些部分。
  • 是的,当然需要具有 64 位内核的 VM 来处理 60GB 的数据(或使用 LFS 的 32 位)。但是请注意,物理内存 + 交换空间可以小于 60GB,“因为当物理内存不足时,映射的页面可以存储回它们的文件”。
【解决方案2】:

所以我解决了我的问题。我在虚拟机上创建了矩阵的本地副本。然后我将该副本移至共享文件夹。这是说明这一点的代码。

#create local copy
data = np.memmap(SIM_FILE, dtype='float32', mode='w+', 
          shape=(len(filelist),len(filelist)))
#move local copy to shared folder
os.system('mv' + " ~/Desktop/" + SIM_FILE + " " + OUT_DIR ) 

【讨论】:

  • 我看到你按照我的建议从np.lib.format.open_memmap 切换到np.memmap。这不是你的代码工作的原因吗?我不知道os.system('mv'... 是如何解决你的问题的……除非失败的雄蕊不是第一个而是第二个。
猜你喜欢
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
相关资源
最近更新 更多