【问题标题】:How to store and load huge images dataset? [duplicate]如何存储和加载巨大的图像数据集? [复制]
【发布时间】:2024-04-30 06:25:02
【问题描述】:

我有一个大型图像数据集要存储。我有 300,000 张图片。每张图片都是一个28800像素的向量,也就是说我有一个(300000, 28800)的矩阵

我保存如下

img_arr = np.stack(images, axis=0)

np.savetxt('pixels_dataset_large.csv',img_arr,delimiter=",")

但是加载它需要很长时间,有时会出现内存错误:

data_pixels=np.genfromtxt("pixels_dataset_large.csv", delimiter=',')

是否有任何替代方案可以优化存储和加载它?

【问题讨论】:

  • np.save/np.load 有什么问题?它将数据保存在内存中,因此不涉及解析,并且该过程将与磁盘允许的一样快。
  • @ivan_pozdeev,我只有在加载时才有问题。当我尝试 np.load() l 得到 TypeError: load() got an unexpected keyword argument 'dtype'
  • 这意味着您错误地使用了loadIt doesn't have a dtype argument.
  • 我做了以下 np.load("pixels_dataset_large.csv", delimiter=',')。没有 dype 参数可以放入 load() !!
  • Ivan 建议存储更聪明(保存、加载)的二进制表示。您现在似乎使用 np.load (再次:二进制!)来加载您使用 savetxt 保存的基于文本(非二进制!)的东西(读取 binary-repr 永远不会使用分隔符信息)。这当然行不通! (所以基本上:savetxt genfromtxt; save load)。 numpy's docs on load even gives a complete example.

标签: python image numpy pickle conv-neural-network


【解决方案1】:

如果您将 300,000 x 28,000 的数据保存到 csv,那么假设使用浮点表示,您正在查看的输出文件大小接近 TB,具体取决于输出的精度。即使您周围有 TB 的磁盘空间,CSV 在这种规模下也非常低效。

在这种情况下,我会建议一些二进制存储方案(例如 hdf5)。你可以查看xarray 包:它非常适合处理这种大小的密集数组数据,它有一个与 NumPy 非常相似的 API,它甚至利用 Dask 来透明地支持并行和/或内存映射计算。

【讨论】:

    最近更新 更多