Как я могу сохранить большой `numpy` в виде массива *.npz с ограниченной емкостью файловой системы?

У меня есть numpy массив, который сохраняется как несжатый файл '*npz', составляет около 26 Гбайт как есть numpy.float32 а также numpy.savez() заканчивается:

OSError: Failed to write to /tmp/tmpl9v3xsmf-numpy.npy: 6998400000 requested and 3456146404 written

Я полагаю, что сохранение сжатого файла может спасти день, но с numpy.savez_compressed() У меня также:

OSError: Failed to write to /tmp/tmp591cum2r-numpy.npy: 6998400000 requested and 3456157668 written

как numpy.savez_compressed() сначала сохраняет массив без сжатия.

Очевидное "использовать дополнительное хранилище" я не считаю ответом.;)

[РЕДАКТИРОВАТЬ]

Тег low-memory относится к дисковой памяти, а не RAM.

2 ответа

Решение

С добавлением ZipFile.open(..., mode='w') в Python 3.6 вы можете сделать лучше:

import numpy as np
import zipfile
import io

def saveCompressed(fh, **namedict):
     with zipfile.ZipFile(fh, mode="w", compression=zipfile.ZIP_DEFLATED,
                          allowZip64=True) as zf:
         for k, v in namedict.items():
             with zf.open(k + '.npy', 'w', force_zip64=True) as buf:
                 np.lib.npyio.format.write_array(buf,
                                                 np.asanyarray(v),
                                                 allow_pickle=False)

Примечание: я был бы более чем счастлив принять более эффективное использование оперативной памяти.

Я просмотрел numpy.savez_compressed() Код и решил переопределить часть его функциональности:

import numpy as np
import zipfile
import io

def saveCompressed(fh, **namedict):
     with zipfile.ZipFile(fh,
                          mode="w",
                          compression=zipfile.ZIP_DEFLATED,
                          allowZip64=True) as zf:
         for k, v in namedict.items():
             buf = io.BytesIO()
             np.lib.npyio.format.write_array(buf,
                                             np.asanyarray(v),
                                             allow_pickle=False)
             zf.writestr(k + '.npy',
                         buf.getvalue())

Это приводит к обмену моей системы, но, по крайней мере, я могу хранить свои данные (фиктивные данные, используемые в примере):

>>> A = np.ones(12 * 6 * 6 * 1 * 6 * 6 * 10000* 5* 9, dtype=np.float32)
>>> saveCompressed(open('test.npz', 'wb'), A=A)
>>> A = np.load('test.npz')['A']
>>> A.shape
(6998400000,)
>>> (A == 1).all()
True
Другие вопросы по тегам