繁体   English   中英

为什么 numpy.save 为 sys.getsizeof 0.33MB 数据生成 100MB 文件?

[英]Why does numpy.save produce 100MB file for sys.getsizeof 0.33MB data?

我有一个 numpy 数组arr (由多个不匹配长度的嵌套列表产生),显然只需要

sys.getsizeof(arr)/(1000*1000)

0.33848

memory 中的 MB 空间。 但是,当我尝试将此数据保存到磁盘时

myf=open('.\\test.npy', 'wb')
np.save(myf, arr)
myf.close()

生成的文件test.npy结果超过 100MB。

这是为什么? 我在测量 python memory 中的实际数据大小时犯了一些错误吗? 或者,如果没有,是否有某种方法可以更有效地保存数据,仅占用硬盘驱动器上接近 0.33848MB 的空间?

编辑:

根据评论中的要求,这里还有一些arr的属性

arr.shape

(14101, 6)

arr.dtype

dtype('O')

arr.itemsize

4

arr.nbytes

338424

即使 dtype 声称是dtype('O') ,该数组也只包含数值(整数和浮点数)。 也许 object 规范是由于嵌套列表的尺寸不匹配而出现的?

numpy.save使用pickle来存储具有“object”dtype 的 arrays。 来自numpy 格式文档

如果dtype包含Python对象(即dtype.hasobject为True),那么数据就是数组的一个Python泡菜

腌制的 python object 的大小与其在 memory 中的大小不同,因此存在差异。

制作一个由几个 arrays 组成的数组:

In [98]: arr = np.array([np.ones(10), np.zeros((200,300)),np.arange(1000).reshape(100,10)],object)   

总 memory 使用:

In [100]: sum([a.nbytes for a in arr]+[arr.nbytes])                                                  
Out[100]: 488104

保存并检查文件大小

In [103]: np.save('test.npy', arr, allow_pickle=True)                                                
In [104]: ll test.npy                                                                                
-rw-rw-r-- 1 paul 488569 Jul  8 17:46 test.npy

这已经够近了!

一个 npz 存档占用大约相同的空间:

In [106]: np.savez('test.npz', *arr)                                                                 
In [107]: ll test.npz                                                                                
-rw-rw-r-- 1 paul 488828 Jul  8 17:49 test.npz

但是压缩有很大帮助:

In [108]: np.savez_compressed('test.npz', *arr)                                                      
In [109]: ll test.npz                                                                                
-rw-rw-r-- 1 paul 2643 Jul  8 17:50 test.npz

我怀疑它是如此可压缩,因为最大的数组全是 0。 使用相同大小的随机值 arrays,压缩仅到 454909。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM