0

我有一个numpy保存为未压缩的“* npz”文件的数组,它的大小约为 26 GiB,numpy.float32numpy.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

asnumpy.savez_compressed()首先保存未压缩的数组。

显而易见的“使用额外的存储空间”我不考虑答案。;)

[编辑]

该标签low-memory是指磁盘内存,而不是 RAM。

4

2 回答 2

1

注意:我会非常乐意接受更高效的 RAM 解决方案。

我浏览了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
于 2018-02-28T13:36:04.087 回答
1

通过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)
于 2018-02-28T16:18:51.040 回答