Python Numpy从google云存储加载内存映射阵列(mmap_模式)
我想将一个.npy从google存储(gs://project/file.npy)加载到我的google ml作业中作为培训数据。由于文件的大小为+10GB,因此我希望使用numpy.load()的mmap_mode选项以避免内存不足 背景:我使用带有fit_生成器和Keras序列的Keras从存储在google存储中的.npy加载批量数据 要访问google存储,我使用的是BytesIO,因为不是每个库都可以访问google存储。 此代码在没有mmap_mode='r'的情况下运行良好:Python Numpy从google云存储加载内存映射阵列(mmap_模式),python,numpy,keras,google-cloud-storage,numpy-memmap,Python,Numpy,Keras,Google Cloud Storage,Numpy Memmap,我想将一个.npy从google存储(gs://project/file.npy)加载到我的google ml作业中作为培训数据。由于文件的大小为+10GB,因此我希望使用numpy.load()的mmap_mode选项以避免内存不足 背景:我使用带有fit_生成器和Keras序列的Keras从存储在google存储中的.npy加载批量数据 要访问google存储,我使用的是BytesIO,因为不是每个库都可以访问google存储。 此代码在没有mmap_mode='r'的情况下运行良好: fr
from tensorflow.python.lib.io import file_io
from io import BytesIO
filename = 'gs://project/file'
x_file = BytesIO(file_io.read_file_to_string(filename + '.npy', binary_mode = True))
x = np.load(x_file)
如果激活mmap_模式,则会出现以下错误:
TypeError:应为str、bytes或os.PathLike对象,而不是BytesIO
我不明白为什么它现在不再接受BytesIO了
代码包括mmap_模式:
x_file = BytesIO(file_io.read_file_to_string(filename + '.npy', binary_mode = True))
x = np.load(x_file, mmap_mode = 'r')
跟踪:
加载返回中的第444行文件“[…]/numpy/lib/npyio.py”
format.open_memmap(file,mode=mmap_mode)文件
“[…]/numpy/lib/format.py”,第829行,在open\u memmap fp中=
打开(os_fspath(filename),'rb')文件“[…]/numpy/compat/py3k.py”,
第237行,操作系统路径“非”+路径类型。名称)类型错误:
应为str、bytes或os.PathLike对象,而不是BytesIO
您可以使用
b.getvalue()
x_file=BytesIO(file_io.read_file_to_string(filename+'.npy',binary_mode=True))
x=np.load(x_file.getvalue(),mmap_模式='r')
查看np.lib.npyio.format.open\u memmap
的文档(或代码)。它显示磁盘上文件的名称。这可能*不是*类似文件的对象。在处理save/load
头之后,此代码使用np.memmap
,因此仅限于可以处理的内容。在memmap模式下,文件被“随机”访问。在普通加载中,访问是按顺序进行的—一个字节接一个字节,没有任何回溯或查找。是否可以拆分数据集,以便您可以上载并逐步处理它?此外,您是否可以检查一下,看看那里的想法是否符合您的需要?如果您可以拆分文件,从我的角度来看,这将是最好的选择。如果你能避免用这种方法耗尽内存,问题就会立即得到解决。公平地说,我不知道如何将范围标题应用到您的用例中,但我认为共享信息是个好主意。