numpy memmap运行时错误。。。。带2Gigas限制的64位系统?

numpy memmap运行时错误。。。。带2Gigas限制的64位系统?,numpy,64-bit,numpy-memmap,Numpy,64 Bit,Numpy Memmap,我正在尝试使用numpy memmap创建一个大文件 big_file = np.memmap(fnamemm, dtype=np.float32, mode='w+', shape=(np.prod(dims[1:]), len_im), order='F') 该系统是一个Windows 10-64位操作系统,在64位python中运行 In [2]: sys.maxsize Out[2]: 9223372036854775807 具有足够的虚拟内存(最大120000Megas) 然而,

我正在尝试使用numpy memmap创建一个大文件

big_file = np.memmap(fnamemm, dtype=np.float32, mode='w+', shape=(np.prod(dims[1:]), len_im), order='F')
该系统是一个Windows 10-64位操作系统,在64位python中运行

In [2]: sys.maxsize

Out[2]: 9223372036854775807
具有足够的虚拟内存(最大120000Megas)

然而,每次我试图创建一个文件,其结果大小应该超过2Gigas,我就会得到一个运行时错误

In [29]: big_file = np.memmap(fnamemm, dtype=np.int16, mode='w+', shape=(np.prod(dims[1:]), len_im), order=order)
C:\Users\nuria\AppData\Local\Continuum\anaconda3\envs\caiman\lib\site-packages\numpy\core\memmap.py:247: RuntimeWarning: overflow encountered in long_scalars
  bytes = long(offset + size*_dbytes)
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-29-66578da2d3f6> in <module>()
----> 1 big_file = np.memmap(fnamemm, dtype=np.int16, mode='w+', shape=(np.prod(dims[1:]), len_im), order=order)

~\AppData\Local\Continuum\anaconda3\envs\caiman\lib\site-packages\numpy\core\memmap.py in __new__(subtype, filename, dtype, mode, offset, shape, order)
    248
    249         if mode == 'w+' or (mode == 'r+' and flen < bytes):
--> 250             fid.seek(bytes - 1, 0)
    251             fid.write(b'\0')
    252             fid.flush()

OSError: [Errno 22] Invalid argument
[29]中的
:big_file=np.memmap(fnamemm,dtype=np.int16,mode='w+',shape=(np.prod(dims[1:],len_im),order=order)
C:\Users\nuria\AppData\Local\Continuum\anaconda3\envs\caiman\lib\site packages\numpy\core\memmap.py:247:RuntimeWarning:在长标量中遇到溢出
字节=长(偏移量+大小*\u字节)
---------------------------------------------------------------------------
OSError回溯(最近一次调用上次)
在()
---->1 big_file=np.memmap(fnamemm,dtype=np.int16,mode='w+',shape=(np.prod(dims[1:]),len_im,order=order)
~\AppData\Local\Continuum\anaconda3\envs\caiman\lib\site packages\numpy\core\memmap.py in\uuuuuu new\uuuuuu(子类型、文件名、数据类型、模式、偏移量、形状、顺序)
248
249如果模式=='w+'或(模式=='r+'和flen<字节):
-->250 fid.seek(字节-1,0)
251 fid.写入(b'\0')
252 fid.flush()
OSError:[Errno 22]参数无效
当文件大小小于2Gigas时,不会发生此错误

我已经用另一个64位的Windows7复制了同样的问题

我忘了什么吗?为什么memmap的作用就像我有一个32位的系统一样


编辑:该错误不完全是运行时错误。变量“bytes”在尝试获取文件长度时会收到运行时警告,我猜这会导致一个错误的参数,该参数会引发错误22,即使系统是64位的,问题可能是因为应用程序是使用32位目标构建的。检查shell执行模式(32位或64位)

对于这样的应用程序,您必须使它们具有大地址意识。然后,32个应用程序可以访问64位机器上的4GB内存

怎么做?这是某人的文章


注意:如果您的应用程序已使用64位目标构建。。忽略此项并放入注释,将删除此答案。

我有一个类似的错误,结果表明,这是因为shape=(a,B)参数中的一个使用int32而不是int64。请尝试以下操作:

len_im64 = np.array(len_im,dtype='int64')
big_file = np.memmap(fnamemm, dtype=np.float32, mode='w+', shape=(np.prod(dims[1:]).astype('int64'), len_im), order='F')

它为我修复了它。

应用程序是python anaconda,应该也是64位的。我使用的是numpy,当您将numpy.distutils.system_info作为sysinfo导入并检查sysinfo.platform_位时,结果是64位。您可以对shell进行简单检查。#对于32位,它将返回32,对于64位,它将返回64导入结构打印(struct.calcsize(“P”)*8)或编辑回答“检查shell执行模式”(32位或64位)。“打印(结构calcsize(“P”)*8)=64