使用numpy错误在python中进行内存映射

时间:2013-07-15 19:49:06

标签: python numpy memory-mapping

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的计算机上试过它,并且它有效。

2 个答案:

答案 0 :(得分: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虚拟内存空间。

答案 1 :(得分:1)

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

#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 )