我想把存在谷歌存储(gs://project/file.npy)上的.npy文件作为训练数据加载到我的谷歌ML任务中。由于该文件大小超过10GB,我想使用numpy.load()函数的mmap_mode选项,以避免内存不足。
背景:我使用Keras和fit_generator以及Keras Sequence从存储在谷歌存储中的.npy文件中加载数据批次。
为了访问谷歌存储,我使用BytesIO,因为并非每个库都能访问谷歌存储。 没有mmap_mode = 'r'选项时,此代码可以正常运行:
如果激活mmap_mode,就会出现以下错误:
TypeError: 期望str、bytes或os.PathLike对象,而不是BytesIO
我不明白为什么它现在不再接受BytesIO了。
包含mmap_mode的代码:
背景:我使用Keras和fit_generator以及Keras Sequence从存储在谷歌存储中的.npy文件中加载数据批次。
为了访问谷歌存储,我使用BytesIO,因为并非每个库都能访问谷歌存储。 没有mmap_mode = 'r'选项时,此代码可以正常运行:
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_mode,就会出现以下错误:
TypeError: 期望str、bytes或os.PathLike对象,而不是BytesIO
我不明白为什么它现在不再接受BytesIO了。
包含mmap_mode的代码:
x_file = BytesIO(file_io.read_file_to_string(filename + '.npy', binary_mode = True))
x = np.load(x_file, mmap_mode = 'r')
跟踪:
文件"[...]/numpy/lib/npyio.py",第444行,在load函数中,返回format.open_memmap(file, mode=mmap_mode);文件"[...]/numpy/lib/format.py",第829行,在open_memmap函数中,fp = open(os_fspath(filename), 'rb');文件"[...]/numpy/compat/py3k.py",第237行,在os_fspath函数中,TypeError: 期望 str、bytes 或 os.PathLike 对象,而不是 BytesIO(path_type.name)。
np.lib.npyio.format.open_memmap
的文档(或代码)。它说“磁盘上的文件名。这可能不是类似文件的对象”。在处理了save/load
头之后,此代码使用np.memmap
,因此受到其限制。 - hpaulj