2016-02-13 3 views
0

Предположим, что у меня есть словарь из примерно 100 тыс. Пар строк и матрица формы (100k, 500). Я хотел бы сохранить их на диск в одном файле.демпинг нескольких объектов в один и тот же файл

Что я сейчас делаю, использую cPickle для дампа словаря и scipy.io.savemat, чтобы выгрузить матрицу. Таким образом, сброс/загрузка происходит очень быстро. Но проблема в том, что, поскольку я использую разные методы, я получаю 2 файла, и я хотел бы иметь только один файл, содержащий мои 2 объекта. Как я могу это сделать?

Я мог бы cPickle их обоих в том же файле, но cPickle невероятно медленно на больших массивах.

+0

Вы пробовали использовать более высокий протокол рассола? Протокол 0, который по умолчанию используется для Python2.7, преобразует все в ASCII, тогда как протоколы 1 и 2 создают двоичный вывод (обязательно откройте выходные файлы в двоичном режиме, то есть '' wb'', а не 'w ' '). ['joblib.dump'] (https://pythonhosted.org/joblib/generated/joblib.dump.html) - еще один очень быстрый метод для сериализации гетерогенных коллекций массивов и объектов Python. –

+0

Посмотрите на 'np.savez'. Он сохраняет каждую переменную в файл в zip-архиве (который может быть сжат). Вы могли бы упаковать кучу маленьких не numpy объектов в словаре или список, который будет сохранен с pickle. 'load' ленив. – hpaulj

ответ

0

Вы можете использовать dill. dill.dump обращается и использует метод dump от numpy для хранения объекта array или matrix, поэтому он хранится так же, как если бы вы сделали это непосредственно из метода на объекте numpy. Вы бы только dill.dump словарь.

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

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

Все эти пакеты дают вам быстрый унифицированный dump для стандартного питона, а также для объектов numpy.