Ошибка памяти файла 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
пытается сделать для вас с простым интерфейсом.