首页 > 解决方案 > 从 Java MemorySegment 高效读取的模式

问题描述

我正在使用 Java 从(可能)大文件中读取(可能)大量数据 - 该场景是来自 HEIF 等文件格式的未压缩图像。可能大于 2G。写作是未来的需要,但这个问题仅限于阅读。

HEIF 格式(源自 ISO 基础媒体文件格式 - ISO/IEC 14496-12)是可变大小的“盒子”——您读取盒子的长度和种类,然后对盒子进行一些适当的解析。在我的设计中,我将解析出小的盒子,并保留对大容量存储 ( mdat) 偏移的引用,以便能够根据要求提取数据以进行渲染/处理。

我正在考虑两个选项 - 多个 MappedByteBuffer(因为这是 2G 限制)和一个MemorySegment(来自内存映射文件)。我不清楚哪个可能更有效。MappedByteBuffer 拥有所有不错的 ByteBuffer API,但我需要管理多个实体。MemorySegment 将是一个条目,但看起来我需要创建切片视图来获取我可以从中读取的任何内容(例如字节数组或 ByteBuffer),这看起来像是同一问题的不同版本。MemorySegment 的第二个好处是,当我需要使用其他一些非 Java API(例如将图像输入硬件编码器进行压缩)时,它可能会带来更好的设计。我还实现并读取了 MemorySegment 的骨架(只是有一些粗略的假设,我可以将它变成单个 ByteBuffer)。

是否存在从 MemorySegment 高效读取的新兴模式?如果做不到这一点,我在 MemorySegment API 中是否缺少一些东西?

标签: javalarge-filesproject-panama

解决方案


推荐阅读