0

ForkJoinPool を介して大量の画像を読み込む際に問題が発生しています。ハイパースヘディングを使用して 4 コアの Intel でテストしているため、8 つの論理スレッドがあります。ただし、プールを 4 スレッドのみに制限します。また、ImageIO で画像が見つからないというエラーが表示されます。

public class LoadImages extends RecursiveAction {
private static final long serialVersionUID = 1L;

//this is an example
private static int threadThreshold = totalImages/totalThreads + 2;

private String[] imgArr;
private int arrStart = 0;
private int arrSize = 0;

public LoadImages(String[] imgs, int start, int size) {
    imgArr = imgs;
    arrSize = size;
    arrStart = start;
}

protected void processImages(){
    BufferedImage img = null;
    for (int i = arrStart; i < arrStart + arrSize; i++) {
        try{
            img = ImageIO.read(new File(imgArr[i]));    
        } catch (IOException | CMMException | NullPointerException e) {
            System.out.println(imgArr[i]);
            e.printStackTrace();
            img = null;
        }

        ...

    }
}

protected void compute() {
    // Check the number of files
    if (arrSize <= threadThreshold) {
        processImages();
        return;
    } else {

        int split = arrSize / 2;

        invokeAll(new LoadImages(imgArr, arrStart, split), new LoadImages(imgArr, arrStart + split, arrSize - split));
    }

}
}

私が間違っていることについての洞察は素晴らしいでしょう.1700以上の画像があり、すべての画像が5MB以上の場合にのみ壊れることに気付きました.

Javaから受け取ったエラーは次のとおりです。

javax.imageio.IIOException: Can't create an ImageInputStream!
at javax.imageio.ImageIO.read(Unknown Source)

ファイルがそこにあることを知っているとき。このコードをガイドとして使用しました: https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

4

3 に答える 3

0

なんかランダムっぽい。私の推測では、ハードウェアまたは OS のエラーである可能性があります。これがスケーリングの問題であると仮定すると、1700 以上の画像に対する私のアドバイスは、これをクラウドのどこかに設定したほうがよいということです。多くの時間と頭痛の種を節約できます。

于 2014-12-11T20:27:52.760 に答える
0

内部で ImageInputStream を作成すると、ImageIO エラーのように思えます。ImageInputStream で画像を読み込もうとしましたか? お気に入り:

InputStream is = new FileInputStream("path");
ImageInputStream iis = ImageIO.createImageInputStream(is);
BufferedImage bufImage = ImageIO.read(iis);
于 2014-12-11T20:49:28.630 に答える