【问题标题】:Large data size when load unpickled file加载未腌制文件时数据量大
【发布时间】:2019-03-16 15:13:17
【问题描述】:

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

酸洗前大约 307 MB (shape= 357,227,227),当我在

中填充图像时

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

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

将它加载到内存中的pickle文件加载为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

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

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

    im[:,:2]
    

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

    【讨论】:

    • 感谢@Alexander Ejbekov,所以除了pickle之外没有其他技术可以解决这个问题吗?
    • @N.zay 不,至少不是以传统方式。但是有一些方法可以克服它,具体取决于您要做什么,即将您的任务分配到多台机器或处理您的数据块或诉诸诸如 dask 之类的解决方案,但您的性能将不可避免地受到缓慢的 io 操作或网络等等。总会有取舍。
    猜你喜欢
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2020-05-28
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多