0

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

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

该系统是在 64 位 python 中运行的 Windows 10-64 位

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

当文件大小低于 2Gigas 时,不会发生此错误...

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

我忘记了什么吗?为什么 memmap 充当我的 32 位系统?

编辑:该错误不完全是运行时错误。变量“bytes”在尝试获取文件的长度时收到运行时警告,导致我猜测一个错误的参数会引发 Errno 22

4

2 回答 2

1

我有一个类似的错误,事实证明这是因为 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')

它为我修好了。

于 2018-12-04T10:22:57.137 回答
0

即使系统是 64 位的,问题也可能是因为应用程序是使用 32 位目标构建的。检查您的 shell 执行模式(32 位或 64 位)。

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

怎么做?这是某人的文章。

https://github.com/pyinstaller/pyinstaller/issues/1288

注意:如果您的应用程序已经使用 64 位目标构建..忽略此并发表评论,将删除此答案。

于 2018-07-30T23:07:26.247 回答