Ошибка памяти файла Pickle - kelpto квестоин

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

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

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

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

2 ответа

Решение

Когда я столкнулся с подобной проблемой, я мог решить ее, используя 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')

Я 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 предназначен для больших данных, не являющихся массивами (таких как таблицы или dicts), в то время как dask предназначен для больших массивов данных.

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

Другие вопросы по тегам