【发布时间】:2016-02-22 02:56:07
【问题描述】:
我有大量的图像,我使用 hdf5 文件格式将它们存储在磁盘上(存储了浮点数的 numpy 数组(22500,3,224,224))。 hdf5 文件的大小为 22 GB。
为此,我使用了 python 的 h5py 库。我使用以下代码创建文件。
h5f = h5py.File('data.h5', 'w')
h5f.create_dataset('data' , data=myNumpyArray)
h5f.close()
我有一个机器学习程序可以学习这些数据。所以我有一个在这些文件上运行的迭代器(我有大量数据,所以我制作了 8 个文件,每个文件 22GB)。迭代器加载每个文件并训练网络。然而,这种文件加载非常非常慢。加载文件大约需要 15 分钟。我正在使用下面的代码来加载文件。
h5f = h5py.File('data.h5', 'r')
myNumpyArray= h5f['data'][:]
h5f.close()
因此,要对数据运行 100 次迭代,我将花费 15*8*100(将其乘以 8,因为我有 8 个文件)= 12,000 分钟(仅用于文件读取),这是我负担不起的。
我第一次做这样的事情,不确定我做的是否正确。
有人可以帮助我如何减少文件读取时间吗?或者我写入数据的方式本身是错误的? 任何帮助将不胜感激。
谢谢, 维杰塔。
【问题讨论】:
-
您的实例有多少内存?如果您的数据比内存大,您将假脱机到磁盘,这将非常慢
-
@maxymoo 提出了一个很好的观点。我会尝试每 220 MB 制作 800 个文件,或者循环遍历类似 h5f['data'][chunksize*i:chunksize*(i+1)]
-
[:]运算符将在 RAM 中创建数组的副本,这真的是您想要的吗?您是否修改数据本身?根据docs.h5py.org/en/latest/high/dataset.html#chunked-storage,HDF5 中的数据默认是连续存储的,这意味着对任何元素的访问基本上都是即时的,不需要 RAM。 -
@maxymoo 我的系统上有 128 GB,我的数据比这大得多。
-
@scf 我尝试使用命令“ myNumpyArray= h5f['data'][0:150] ”循环遍历数据。但总的来说,它所花费的时间与一次加载整个文件所花费的时间相同。所以我被困在这里。
标签: python image-processing machine-learning computer-vision h5py