【问题标题】:Processing an image in parallel using java 8使用 java 8 并行处理图像
【发布时间】:2018-04-30 07:59:11
【问题描述】:

我通过计算图像的小块(64X64 像素)上的参数来处理大量 4k 图像。该任务现在以顺序方式执行,一次一个补丁。下面复制了我的代码的 sn-p 以向您展示这个想法。

for (int i = 0; i < imageW / pSize; i++) {
  for (int j = 0; j < imageH / pSize; j++) {

  thisPatch = MatrixUtil.getSubMatrixAsMatrix(image, i * pSize, j * pSize, pSize);
  results[i][j] = computeParamForPatch(thisPatch);
  }
}

我现在需要并行化它以节省一些时间。如您所见,每个补丁的过程完全独立于所有其他补丁。为此,我需要使用MapforEachOrdered() 记住每个补丁的位置。不幸的是,我不认为使用地图,像Map&lt;Point, double[][]&gt; 这样的东西会被并行化。所以这是我的问题:除了使用forEachOrdered() 会对性能产生负面影响之外,还有其他方法可以并行处理图像吗?


一种解决方案: 我尝试了以下代码(由@DHa 建议),它取得了显着的改进:

int outputW = imageW / pSize;
int outputH = imageH / pSize;
IntStream.range(0, outputW * outputH).parallel().forEach(i -> {

 int x = (i % outputW);
 int y = (i / outputH);
 tDirectionalities[x][y] = computeDirectionalityForPatch(
                    MatrixUtil.computeParamForPatch(image, x * pSize, y * pSize, pSize));
});

结果:

  • 连续:15754 毫秒
  • 并行:5899 毫秒

【问题讨论】:

  • ExecutorService
  • 为什么要并行化this?似乎并行处理 图像 比尝试并行处理每个图像同时仍按顺序处理图像要容易得多。
  • @AndrewHenle 因为那样 IO 将成为更大的瓶颈。
  • 一张 4K 图像占用大量内存,因此一次处理一张显然是有益的。
  • @DHa 20 MB 的“内存太重”如何?

标签: java image-processing parallel-processing


【解决方案1】:

此解决方案使用并行流。

另请参阅How many threads are spawned in parallelStream in Java 8,了解如何控制同时在流上工作的线程数量。

    int patchWidth = (int)Math.ceil((double)imageW / pSize);
    int patchHeight = (int)Math.ceil((double)imageH / pSize);

    IntStream.range(0, patchWidth * patchHeight).parallel().forEach(i -> {
        int x = (i % patchWidth);
        int y = (i / patchWidth);

        thisPatch = MatrixUtil.getSubMatrixAsMatrix(image, x * pSize, y * pSize, pSize);
        results[x][y] = computeParamForPatch(thisPatch);
    });

【讨论】:

  • 我在测试中犯了一个愚蠢的错误(这就是为什么我在这里删除了我的评论)。事实上,您提出的并行版本确实使其速度明显加快。查看我的更新。
  • @Azim 从您给出的计时结果看来,您现在正在使用 3 个核心,parallel() 将默认使用全部 - 1 个核心,因此如果您使用链接以将其增加到所有内核,您可以进一步增加结果,但可能会使其他线程无法占用 CPU 时间。也许更好的方法是将剩余的核心用于处理此函数的输入/输出的 IO 操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多