Numpy загружает массив с отображением памяти (mmap_mode) из облачного хранилища Google

Я хочу загрузить .npy из хранилища Google (gs: //project/file.npy) в свое задание google ml в качестве обучающих данных. Поскольку размер файла составляет +10 ГБ, я хочу использовать параметр mmap_mode в numpy.load (), чтобы не исчерпать память.

Предыстория: я использую Keras с fit_generator и Keras Sequence для загрузки пакетов данных из .npy, хранящегося в хранилище Google.

Для доступа к хранилищу Google я использую BytesIO, поскольку не каждая библиотека может получить доступ к хранилищу Google. Этот код отлично работает без 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, в формате возврата загрузки. 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 «not» + path_type. имя ) TypeError: ожидаемый объект str, bytes или os.PathLike, а не BytesIO


person DΦC__WTF    schedule 30.12.2019    source источник
comment
Посмотрите документацию (или код) np.lib.npyio.format.open_memmap. Там написано The name of the file on disk. This may *not* be a file-like object. После обработки заголовка save/load этот код использует np.memmap, поэтому он ограничен тем, что он может обработать.   -  person hpaulj    schedule 30.12.2019
comment
В режиме мем-карты доступ к файлу осуществляется «случайным образом». При обычной загрузке доступ является последовательным - один байт за другим без какого-либо возврата или поиска.   -  person hpaulj    schedule 30.12.2019
comment
Разве не самая большая проблема, что tenorflows fileIO.read_file_to_string () читает весь файл? Так что с memmap это все равно не сработает, верно?   -  person DΦC__WTF    schedule 30.12.2019
comment
@hpaulj ты хоть представляешь, какую библиотеку я мог бы использовать вместо этого? Я тоже не получаю ваш комментарий при случайном и последовательном доступе   -  person DΦC__WTF    schedule 30.12.2019
comment
Можно ли разделить набор данных, чтобы вы могли загружать его и обрабатывать поэтапно?   -  person Happy-Monad    schedule 31.12.2019
comment
Кроме того, не могли бы вы проверить эту ветку, чтобы узнать, соответствует ли эта идея вашим потребностям. ?   -  person Happy-Monad    schedule 31.12.2019
comment
Да, я могу разделить файл еще больше, сейчас у меня 5 файлов по 10 ГБ.   -  person DΦC__WTF    schedule 31.12.2019
comment
Насколько легко было бы вручную читать части файла .npy, используя заголовок диапазона, упомянутый в вашем потоке. Структура данных в файле .npy имеет вид [10000: 50: 50: 50: 1], а размер 10000 может быть разделен на файлы меньшего размера.   -  person DΦC__WTF    schedule 31.12.2019
comment
Если вы можете разделить файл еще больше, это будет лучшим вариантом с моей точки зрения. Если таким способом можно избежать нехватки памяти, проблема будет решена немедленно. Честно говоря, я не знаю, как применить заголовок диапазона к вашему варианту использования, но подумал, что было бы неплохо поделиться информацией.   -  person Happy-Monad    schedule 03.01.2020


Ответы (1)


Вы можете перейти от BytesIO к байтам, используя b.getvalue()

x_file = BytesIO(file_io.read_file_to_string(filename + '.npy', binary_mode = True))
x = np.load(x_file.getvalue(), mmap_mode = 'r')
person Juancki    schedule 06.01.2020