首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在文件系统容量有限的情况下保存一个大的‘`numpy`’as '*.npz‘数组?

如何在文件系统容量有限的情况下保存一个大的‘`numpy`’as '*.npz‘数组?
EN

Stack Overflow用户
提问于 2018-02-28 12:12:26
回答 2查看 4.4K关注 0票数 0

我有一个numpy数组,它保存为未压缩的'*npz‘文件,大约是26个GiB,因为它是numpy.float32numpy.savez()的结尾是:

代码语言:javascript
运行
复制
OSError: Failed to write to /tmp/tmpl9v3xsmf-numpy.npy: 6998400000 requested and 3456146404 written

我认为压缩后的保存可能会节省时间,但使用numpy.savez_compressed(),我还可以:

代码语言:javascript
运行
复制
OSError: Failed to write to /tmp/tmp591cum2r-numpy.npy: 6998400000 requested and 3456157668 written

因为numpy.savez_compressed()首先保存了未压缩的数组。

显而易见的“使用额外的存储”,我认为没有答案。;)

编辑

标记low-memory指的是磁盘内存,而不是内存。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-28 16:18:51

在Python3.6中添加ZipFile.open(..., mode='w'),您可以做得更好:

代码语言:javascript
运行
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-02-28 13:36:04

注意:我非常乐意接受一个更高效的内存解决方案.

我浏览了numpy.savez_compressed()代码,并决定重新实现其部分功能:

代码语言:javascript
运行
复制
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())

它会导致我的系统交换,但至少我能够存储数据(示例中使用的假数据):

代码语言:javascript
运行
复制
>>> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49029309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档