Ошибка памяти файла Pickle - kelpto квестоин - PullRequest
0 голосов
/ 22 мая 2019

Я получаю сообщение об ошибке памяти при попытке выбрать большой массив с numpy для проблемы глубокого обучения shape: (7451, 1500, 1500, 1)).Тем не менее, я вижу несколько сообщений на klepto и читаю документы, но я не уверен, как на самом деле использовать klepto для сохранения в виде файла рассола.

Может ли кто-нибудь разбить его до уровня пятого класса для меня?

Это выбрасывает ошибку памяти:

pickle_out = open("X.pickle", "wb")
pickle.dumps(X, pickle_out)
pickle_out.close()

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Я klepto автор.Если вы действительно просто пытаетесь выбрать массив numpy, лучший способ - просто использовать встроенный метод dump в array (если массив не слишком велик, чтобы соответствовать ограничениям памяти).

Практически любой код, выполняющий сериализацию, использует один из пакетов сериализации (dill, cloudpickle или pickle), если только в сам объект не встроен метод сериализации, как в numpy.joblib использует cloudpickle, а оба cloudpickle и dill используют внутреннюю сериализацию, которую предоставляет сам массив numpy (pickle не использует его, и, следовательно, сериализация раздувается и может привести к сбоям памяти).

>>> import numpy as np
>>> a = np.random.random((1500,1500,1500,1))
>>> a.dump('foo.pkl')

Если приведенное выше по-прежнему вызывает ошибку памяти, то joblib, klepto, dill или иное действительно не могут помочь вам, если вы не разбиваете массив на более мелкие куски -- или, возможно, использовать массив dask (который предназначен для больших массивов данных).Я думаю, что ваш массив достаточно велик, чтобы он должен вызывать ошибку памяти (я проверял это на моей собственной системе) даже с помощью описанного выше оптимально эффективного метода, поэтому вам нужно будет либо разбить массив на куски,или сохраните его как массив dask.

Для ясности, klepto предназначен для больших данных, не являющихся массивами (например, таблиц или диктов), а dask предназначен для данных больших массивов.

Другой вариант - использовать массив numpy.memmap, который напрямую записывает массив в файл, минуя память.Они немного сложны в использовании, и это то, что dask пытается сделать для вас с помощью простого интерфейса.

0 голосов
/ 22 мая 2019

Когда я столкнулся с подобной проблемой, я мог решить ее, используя joblib. Сначала вам нужно установить библиотеку sklearn, что можно сделать, например, с помощью

pip install sklearn

Это просто основная идея, чтобы лучше узнать, как его установить, перейдите по адресу https://scikit -learn.org / stable / install.html Итак, все довольно плоско и проиллюстрировано в следующем коде

from sklearn.externals import joblib
import numpy as np
array=np.array([0,1,2]) # thats explanatory array, you should use your instead

filename = 'array.sav'
joblib.dump(array, filename)  

Затем, чтобы загрузить ваши данные, когда вам нужно их использовать:

array = load(filename, mmap_mode='r')
...