【问题标题】:how can I add metadata to a numpy memmap array?如何将元数据添加到 numpy memmap 数组?
【发布时间】:2015-09-10 19:33:54
【问题描述】:

是否可以将少量元数据附加到 numpy memmap 文件中?

这就是我的全部问题。对于那些有兴趣的人,我的问题的详细信息如下:

我的数据集由一堆图像及其对应的多值标签组成,例如:

图像:一个 50000 x 96 x 96 x 3 的 uint8s 数组

标签:50000 x 5 整数数组

我将这些保存到长度为 50000 的 numpy 记录数组和 dtype (96, 96, 3) uint8, (5, ) int 中。这很棒,因为我可以使用 numpy.lib.format.open_memmap() 将两个数组保存在单个 memmap 文件中。

缺少的一件事是向文件添加少量元数据的能力。具体来说,我想将前 N 个条目指定为“训练集”,将剩余的 50000 - N 个条目指定为“测试集”。因此,至少,这需要将单个 int (N) 添加到文件中。更一般地说,我想允许任意数量的分区,以及它们的分区名称。例如,对于 3 个分区,这将需要保存以下附加数据:

partition_names = ["testing set", "validation set", "training set"]
partition_sizes = [30000, 10000, 10000]  # last number redundant

有没有办法将此元数据添加到 memmap 文件中,同时保留我使用 numpy.lib.open_memmap() 或类似方便的方式对文件进行内存映射的能力?

PS:我曾经使用 h5py,它显然更适合存储这些额外的数据,但是与 numpy memmaps 相比,它在读取大图像时的性能很糟糕。

【问题讨论】:

  • 很好奇您是否或如何解决了这个问题。我想做同样的事情。

标签: python arrays numpy dataset mmap


【解决方案1】:

正如您在问题中指出的那样,HDF5(或 NetCDF)将是一种更适合存储具有多个数组、元数据等的复杂数据集的格式。

HDF5 已开发并用于许多高性能应用程序。如果使用 numpy memmap 得到的结果要差得多,则可能意味着您没有有效地使用它。

看看PyTables,例如blosc压缩(例如this post)。如有必要,您可以对许多内容进行微调,如 optimization tips 中所述(具体参见图 3)。

【讨论】:

  • 我宁愿不处理 pytables 增加的复杂性。甚至 h5py 对我的应用程序来说也有点过分了。我希望数据连续存储,所以分块存储(AFAICT 将块存储在随意的位置,然后用 b-tree 索引它们)不是很好。幸运的是,h5py 默认为没有压缩的连续存储。为什么它很慢取决于猜测,但 memmap 给了我令人满意的性能,所以我想我会坚持使用它们,无论我是否可以存储这些额外的元数据。只是如果可以的话就好了。
【解决方案2】:

它看起来像是一个非零 memmap 关键字 arg offset 和一些二进制文件编辑的组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多