Загрузка файла .npy, который слишком велик для оперативной памяти

#python #dataframe #numpy #google-colaboratory #ram

Вопрос:

Я пытаюсь загрузить большой файл .npy (~800 МБ) в Google Collab, но каждый раз, когда я пытаюсь это сделать, экземпляр Collab выходит из строя из-за чрезмерного использования оперативной памяти.

      import numpy as np
     a=np.load('oddata.npy',allow_pickle=True)
 

Я использую базовый экземпляр Collab с 12 ГБ оперативной памяти.

Я пробовал использовать mmap, но он возвращает эту ошибку: Ошибка значения: Массив не может быть сопоставлен с памятью: объекты Python в dtype.

Есть ли в любом случае проблема, например, разбить файл .npy на куски или преобразовать его в другой формат файла.

Лучшие,

Araf

Комментарии:

1. HDF5 поддерживает чтение файлов по частям. Вы можете попробовать конвертировать ваш файл в HDF5, но вам нужно, по крайней мере, открыть его на машине, на которой выполняется преобразование. Вы могли бы сделать это, например, на машине с довольно большой памятью подкачки. Однако обратите внимание, что HDF5 не будет принимать объекты pure-Python, и я думаю, что это ваша главная проблема здесь. Почему бы не использовать собственные типы?

2. Очень признателен за быстрый ответ. Проблема в том, что это готовый набор данных, поэтому у меня действительно не было возможности создать его ни одного из собственных типов.

Ответ №1:

Я думаю, что в вашей проблеме есть нечто большее, чем недостаток памяти. 12 ГБ, выделенных в вашем экземпляре Collab, должно быть более чем достаточно для чтения файла размером 800 МБ. Чтобы подтвердить это, я провел простой тест на своем Raspberry Pi (у которого всего 4 ГБ оперативной памяти). Он может создать файл размером 1 ГБ .npy и прочитать его обратно в новый массив. Вот код:

 import numpy as np
nimg, n0, n1 = 1000, 512, 512
arr = np.arange(nimg*n0*n1).reshape(nimg,n0,n1)
print(arr.dtype, arr.shape)

np.save('SO_67671598.npy',arr)
arr2 = np.load('SO_67671598.npy')    
print(arr2.dtype, arr2.shape)
 

Я получаю тот же результат с allow_pickle=True параметром или без него. Обратите внимание, что allow_pickle=True это не рекомендуется (по соображениям безопасности). Это необходимо при загрузке массивов объектов. Я предлагаю вам запустить этот тест в вашем экземпляре Collab и посмотреть, что вы получите.

Комментарии:

1. Сэр, я попробовал предложенный вами тест и смог запустить его на своем экземпляре Collab без каких-либо проблем. На данный момент я подозреваю, что мой файл данных, скорее всего, поврежден. Я попытаюсь воссоздать файл .npy из сценария загрузки файла. Большое вам спасибо за потраченное время!