0

このコードは、フォルダー内の画像を検索し、それらの画像を 6000x6000 の画像に結合する必要があります。動作していますが、本当に遅いです。私が実装できる最適化はありますか??

File in = new File(args[1]);
            File out = new File(args[2]);
    in.mkdirs();
    out.mkdirs();
    if(out.exists())
    {
        out.delete();
    }
    if(!in.isDirectory())
    {
        Main.printUsage();
    }


    BufferedImage bout = new BufferedImage(6032, 6032, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = bout.createGraphics();
    int count = 0;
    long starttime = System.currentTimeMillis();
    for(int i=0; i<=376; i++)
    {
        for(int k=0; k<=376; k++)
        {
            File cu = new File(in, (i-188)+"-"+(k-188)+".png");
            if(cu.exists())
            {
                count++;
                try {
                    g.drawImage(ImageIO.read(cu), 16*i, 16*k, null);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Runtime.getRuntime().;
            }
        }
    }
    System.out.println("Processed "+count+" chunks in "+((System.currentTimeMillis()-starttime)/1000F)+" seconds");

    g.dispose();
    try {
        ImageIO.write(bout, "png", out);
    } catch (IOException e) {
        e.printStackTrace();
    }
4

3 に答える 3

2

ファイル システムで遅延が発生している可能性があり、これらのファイルがすべて開かれます。1 つのディレクトリに多くのファイルがあると、ディレクトリ内の検索時間だけでも簡単ではなくなります。

この場合、ソフトウェアによる解決策はありません。ファイルをフラッシュドライブに置いて、テストとしてのみでも役立つかどうかを確認してください.

于 2012-05-18T22:25:23.253 に答える
1

サイズが 6032*6032 の画像と、それぞれが 376 のサイズの 2 つのネストされたループ 少なくとも 2 回で約 3600 万ピクセルを描画し、141,000 回ループします

ファイルの読み取りを忘れないでください...

2 つのスレッドを使用して画像のペアを組み合わせてみることをお勧めします

于 2012-05-19T00:13:50.683 に答える
0

アプリケーションはわかりませんが、新しく作成したイメージを保存して、新しいイメージを生成する前に最新のイメージであるかどうかを確認できます。または、さらに情報を保存して、変更された部分のみを更新します。

しかし、プログラムをロードするたびにすべてが変わる場合、ボトルネックは明らかにI/Oの遅延です。SSDまたはレイドシステムのためのお金がなければ、あなたはそれを通り抜けることはできません;)

于 2012-05-18T23:28:04.283 に答える