如何将一个大的 `numpy` 保存为文件系统容量有限的 '*.npz' 数组?
How can I save a big `numpy` as '*.npz' array with limited filesystem capacity?
我有一个 numpy
数组,它保存为一个未压缩的 '*npz' 文件,大约 26 GiB,因为它是 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
as numpy.savez_compressed()
先保存未压缩的数组。
明显的"use additional storage"我不考虑回答。 ;)
[编辑]
标签 low-memory
指的是磁盘内存,而不是 RAM。
注意:我很乐意接受更RAM-efficient的解决方案。
我浏览了 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
在 Python 3.6 中添加了 ZipFile.open(..., mode='w')
,您可以做得更好:
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
数组,它保存为一个未压缩的 '*npz' 文件,大约 26 GiB,因为它是 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
as numpy.savez_compressed()
先保存未压缩的数组。
明显的"use additional storage"我不考虑回答。 ;)
[编辑]
标签 low-memory
指的是磁盘内存,而不是 RAM。
注意:我很乐意接受更RAM-efficient的解决方案。
我浏览了 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
在 Python 3.6 中添加了 ZipFile.open(..., mode='w')
,您可以做得更好:
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)