加载大量小文件效率低下

时间:2021-07-01 21:45:49

标签: python pandas numpy

我无法将大量小图像文件(大约 90k png 图像)加载到单个 3D np.array 中。 当前的解决方案需要几个小时,这是不可接受的。

图片大小为 64x128。

我有一个名为 pd.DataFramelabels,其中包含图像的名称,并希望以与 labels 变量中相同的顺序导入其图像。

我目前的解决方案是:

dataset = np.empty([1, 64, 128], dtype=np.int32)

for file_name in labels['file_name']:
    array = cv.imread(f'{IMAGES_PATH}/{file_name}.png', cv.COLOR_BGR2GRAY)
    dataset = np.append(dataset, [array[:]], axis=0)

据我统计,最耗时的操作是 dataset = np.append(dataset, [array[:]], axis=0),每张图像大约需要 0.4 秒。

是否有更好的方法导入此类文件并将其存储在 np.array 中?

我正在考虑多处理,但我希望 labelsdataset 的顺序相同。

1 个答案:

答案 0 :(得分:0)

游戏开发人员通常将成束的小图像连接成一个大文件,然后使用大小和偏移量来切出当前需要的部分。以下是如何使用 imagemagick 完成此操作的示例:

montage -mode concatenate -tile 1x *.png out.png

但话又说回来,它不会解决读取 90k 小文件的问题。魔法有它自己的特点,在您的情况下可能会也可能不会出现。

另外,我最初没有注意到您在使用 np.append(dataset, [array[:]], axis=0) 时遇到问题。 那是非常糟糕的线路。在循环中追加永远不是高性能代码。

要么预先分配数组并写入它。或者使用 numpy 的函数在 once 处连接多个数组:

dataset = np.empty([int(90e3), 64, 128], dtype=np.int32)
for i,file_name in enumerate(labels['file_name']):
    array = cv.imread(f'{IMAGES_PATH}/{file_name}.png', cv.COLOR_BGR2GRAY)
    dataset[i,:,:] = array
相关问题