【问题标题】:Speed up writing multiple image TIFF?加快写入多个图像 TIFF?
【发布时间】:2015-10-27 09:29:41
【问题描述】:

我正在尝试将图像堆栈写入 TIFF 文件。图像大小为 256*256 像素,每个堆栈包含 1000 张图像。编写其中一个文件大约需要 4 分钟 - 所以我的代码很可能有问题。

这就是我正在做的事情:

void Tiff_WriterSplit(float data[], int PicNum, int WIDTH, int LENGTH, char PATH[]) {
     int i;
     int rows = LENGTH, columns = WIDTH;
     TIFF* tif;

     if (PicNum == 0)
         tif = TIFFOpen(PATH, "w");
     else
         tif = TIFFOpen(PATH, "a");

     TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, columns);
     TIFFSetField(tif, TIFFTAG_IMAGELENGTH, rows);
     TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
     TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32);
     TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);

     for (i = 0; i < rows; i++)
         TIFFWriteScanline(tif, &data[i * columns], i, 0);

     TIFFWriteDirectory(tif);
     TIFFClose(tif);
}

将为堆栈的每个图像调用此函数Tiff_WriterSplit。第一个图像将有PicNum = 0w 模式打开tiff 文件,以下所有图像将有一个PicNum &gt; 0a 模式打开它。以大约 40 MB/s 的速度开始写入,随着文件大小的增加而变得越来越慢 - 下降到大约 1 MB/s。如何优化性能?

【问题讨论】:

  • 你在什么设备上写?
  • 我在一个特定的“工作马”上运行它,它从服务器(通过 10 Gbit 以太网)获取数据并将其写回服务器。我还以大约 100 MB/s 的速度将二进制格式的原始数据写入服务器。所以,硬件不应该是这里的问题......
  • @thomas 感谢您的建议!这确实是服务器的问题 - 在本地存储文件每个文件需要

标签: c file-io tiff


【解决方案1】:

编写 tiff 比阅读 tiff 容易得多。 libtiff 的开销对于写入性能可能非常有限。假设你有一个可以用 tiff 标头表示的像素格式的缓冲区,编写 tiff 的步骤,

  1. 编写 tiff 标头
  2. 写入图片数据
  3. 写入目录(标签表)。

对于多图像 tiff,我们受到 32 位条目的 4GB tiff 限制。但是,如果您的图像始终具有相同的几何形状(宽度、高度、平面、深度),则可以在写入所有图像数据后写出标记表中的目录条目。您可以随意将目录放在 tiff 二进制文件的末尾(或开头)。如果最后并且您知道图像的数量,则可以在写入图像之前形成目录条目(就地构建表)。如果 API 不允许您事先知道图像的数量,则必须在写入最终图像后在 IFD 中计算最终文件偏移量。

直接编写 tiff 可以让您使用fallocatemmap 和其他可以加快编写多图像 tiff 的操作系统功能。如果需要转换图像格式,这项工作在计算上会更具挑战性,因为它可能涉及信号处理。

使用直接写入与 libtiff 相比,单个图像平面的写入速度可以快 3 倍以上。如果 libtiff 不断地在 tiff (IFD) 的末尾重新计算和重新定位标签表,那么这将是每张图像 O(n^2)。

我使用这种技术将科学图像传感器数据从 设备流式传输到磁盘。它允许以更高的 FPS 进行捕获。

结合使用多 tiff(目录)结构的视觉分析来查找感兴趣区域将允许在单个 tiff 中为每个帧保存多个感兴趣区域。

参考

【讨论】:

    【解决方案2】:

    我遇到过类似的性能问题。似乎(从 libTiff 版本 4.0.9 开始)TIFFWriteDirectory 中存在性能问题,导致其运行时间与多页 TIFF 文件中已经存在的图像数量成比例。

    我认为这与 TIFF 文件规范的编写方式无关 - 我认为这是 libTiff 中的一个性能错误。

    我发现保存前 80 张图像(大约 24,000 字节)需要 21 毫秒,但是当我将 9,000 张图像写入同一个文件时,这会线性上升到 3 秒。 99.5% 的时间花在 TIFFWriteDirectory(调用 TIFFLinkDirectory,其中大部分时间花在 _tiffReadProc)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多