[英]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.