Я 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
пытается сделать для вас с помощью простого интерфейса.