首页 > 解决方案 > 加载未腌制文件时数据量大

问题描述

解压后文件大小有问题。文件夹大小

酸洗前大约 307 MB(形状= 357,227,227),当我填充图像时

文件夹到所需的大小(6000,227,227))然后使用 gzip 腌制它

压缩后,pickle 文件大小变为 14 mb。但是,当我尝试

将它加载到内存中的泡菜文件加载为 1.25 GB,而它在

磁盘 307 MB 为什么会发生这种情况,有没有办法用它加载泡菜文件

内存大小是否相同?下面是示例输出。

import gzip


 f=gzip.open('C:/Users/Documents/data/folder_030.pklz','rb')
 img_array = pickle.load(f)
 img_array.shape
 print('size of unpickle images',sys.getsizeof(img_array) )


 X = np.empty((1,6106 ,227, 227), dtype='float32')

 print('empty X shape',X.shape)

for i in range(1):

  X[i] = img_array

 print(X.shape)


 print('size of unpickle file',sys.getsizeof(X))

这是输出:

 (6106, 227, 227)
 size of unpickled images 128

 X.shape (1, 6106, 227, 227)
 size of x  1258544440

标签: pythonpython-3.x

解决方案


存储在磁盘上的任何数据的大小都会与脚本中的相同数据有很大不同。存储在磁盘上的数据几乎总是比内存中的数据占用更少的空间(pickles、h5 或您正在使用的任何东西)。当您加载数据时,它会从字节(pickles 本质上是什么)转换为一个 numpy 对象,该对象包含许多属性和属性,这些属性和属性由于明显的原因不会存储在磁盘上——它们不是必需的。在磁盘上,您只需要数组的值,仅此而已。那是没有增加对压缩的影响。但是,当您将数据加载到内存中时,所有这些属性都会被初始化,以便能够快速访问切片、数学运算和转换。考虑以下切片:

im[:,:2]

如果 Numpy 不使用多个指针来快速有效地访问该信息,它就不可能拥有它的能力或性能。不用说,这些指针将对内存产生重大影响。所以不,您将无法将泡菜加载到内存中,并且恐怕不用支付额外的内存价格。


推荐阅读