python - 加载未腌制文件时数据量大
问题描述
解压后文件大小有问题。文件夹大小
酸洗前大约 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
解决方案
存储在磁盘上的任何数据的大小都会与脚本中的相同数据有很大不同。存储在磁盘上的数据几乎总是比内存中的数据占用更少的空间(pickles、h5 或您正在使用的任何东西)。当您加载数据时,它会从字节(pickles 本质上是什么)转换为一个 numpy 对象,该对象包含许多属性和属性,这些属性和属性由于明显的原因不会存储在磁盘上——它们不是必需的。在磁盘上,您只需要数组的值,仅此而已。那是没有增加对压缩的影响。但是,当您将数据加载到内存中时,所有这些属性都会被初始化,以便能够快速访问切片、数学运算和转换。考虑以下切片:
im[:,:2]
如果 Numpy 不使用多个指针来快速有效地访问该信息,它就不可能拥有它的能力或性能。不用说,这些指针将对内存产生重大影响。所以不,您将无法将泡菜加载到内存中,并且恐怕不用支付额外的内存价格。
推荐阅读
- python - 运行 Python 脚本时使用代理出现问题
- sql-server - Service Broker 中的存储过程无法访问同一服务器实例下的另一个数据库
- c++ - 最新的编译器版本和 GLIBC_2.32 依赖项
- sql - 总结我的数据并添加新属性的最佳方法是什么?
- laravel - 验证取决于单选按钮选择 laravel
- php - PHPMailer 发送电子邮件但不显示返回的电子邮件
- javascript - 本地文件上传 -> Canvas 灰度和降级 -> ocr.space
- java - 使用 Jackson 序列化具有“查询”属性名称的对象
- scala - 数据框中的新列源自第二个数据框
- django - 自动将 gitlab 管道与 azure Web 服务连接