跳转到内容

顺序访问、随机访问与实体化

复制本页

访问模式决定 Pipeline 可以按什么顺序向加载器请求像素。它和“文件是不是流”不是同一件事:一个按顺序模式打开的 JPEG,仍然可能被后续操作要求回头读取。

方式 加载器承诺什么 适合什么
随机访问(Random access) 可以按任意区域、多次读取 方向不确定、要裁智能区域、或同一图像要服务多个输出
顺序访问(Sequential access) 通常只能从上到下读一次 缩小、水平翻转、多数按行卷积、单次转码
实体化(Materialisation) 先将解码结果完整缓冲到内存或临时文件,再提供随机读取 顺序流后面必须做随机操作时的显式代价

顺序访问需要调用方显式开启。govips 用导入参数里的 AccessSequential,sharp 用 sequentialRead: true,pyvips 用 access="sequential",CLI 用 [access=sequential]。未设置时,四个入口的默认缓冲策略并不完全相同。

导出器从结果图像往回请求像素。顺序加载器只能继续向前读。一旦某个操作需要底部的行、需要重读已经放过的行,或者需要把同一条顺序 Pipeline 分给两个消费者,加载器就会拒绝。

因此排查顺序是:

  1. 看输入是按顺序模式打开,还是已经实体化(完整解码并缓冲到内存或临时文件)。
  2. 看失败前的最后一个操作是否需要随机读取。
  3. 看错误是在 Export、Save 还是 CLI 写出文件时出现。

顺序路径通常可以完成:按比例缩小、提取靠上的区域、水平翻转、颜色空间转换和 flatten。

以下操作通常需要随机访问或整图实体化:90° 及 180° 旋转、垂直翻转、基于熵或注意力的智能裁剪,以及对同一顺序图像的第二次读取。需要它们时,应在加载前改用随机访问,或先实体化再变换。

实体化换来的是随机读取能力,代价是更多内存或临时磁盘占用。它不是缓存未命中,也不能靠重试消除。