3

Java アプリケーションを高速化するには?

Cobolファイルを1行ずつ解析し、必要なデータを抽出してDB2データベースに入力するJavaアプリケーションに取り組んでいます。

解析するファイルがさらにある場合、アプリケーションが完了するまでに 24 時間以上かかるため、これは許容できません。

だから私はスピードアップのために別のスレッドでいくつかのテーブルの作成を行います..eg

ArrayList list = (ArrayList)vList.clone();
ThreadPopulator populator = new ThreadPopulator(connection, list, srcMbr);
Thread thread = new Thread(populator);
thread.run();
return;


And ThreadPopulator class is implementing Runnable interface and run method as

public void run()
{
    try
    {
        synchronized (this)
        {
           int len = Utils.length(list);
           for (int i = 0; i < len; i++)
           {
              .....
              stmt.addBatch();
            if ((i + 1) % 5000 == 0)
                    stmt.executeBatch(); // Execute every 5000 items.
           }
        }
    }
    catch (Throwable e)
    {
        e.printStackTrace():
    }
    finally
    {
        if (list != null)
            list.clear();
    }
}

注: 次のスレッドがエントリを消去できないように、クローンを使用する必要があります。

私は正しい方法で考えていますか?

何千もの COBOL ファイルよりもアプリケーションを高速化するためにどのような方法を選択する必要があるか教えてください。

4

2 に答える 2

7

最初に、ほとんどの時間を何に費やしているかを判断する必要があります。これには、CPUと場合によってはメモリ使用量を測定する必要があります。CPUを使用している解析なのか、IOを使用しているデータベースなのか。

パフォーマンスのボトルネックを測定しないと、何を改善する必要があるかについて情報に基づいた決定を下すことはできません。

私の経験から、私は最初にデータベースを疑うでしょう。バッチサイズは5000で、これで十分です。プログラムの実行中にどのくらいのCP​​Uを使用していますか?たとえば、1つのCPUは常にビジーですか?

注:約40〜100 MB/sを読み取るための単純なテキストパーサーを作成できます。24時間実行するには、ロードするデータが大量にある必要がありますが、これが原因である可能性は低いと思われます。

実際には、最初にファイルを適切な形式で書き直してから、それらの行を読み取り、必要なデータを抽出する必要があります。1つのファイルに対して2〜3回読み取られたソース行も含まれます(実際にはこれは論理部分です)。4000Kファイルでアプリケーションを実行すると、24時間実行されます。

400万ファイルがパフォーマンスの問題になります。些細なファイルを開くだけでも、高速HDDの場合は約8ミリ秒かかり、それぞれ2〜3回開くと、合計で約30時間かかります。(ディスクキャッシュを使用すると数時間節約できると思います)高速化する唯一の方法は次のとおりです。

  • 使用するファイルが少なくなります。400万は何度も開くのは非常識な数です。それらを1回だけ開くと約10時間かかります(それらで何かをすることを気にしないでください)
  • より高速なドライブを使用します。たとえば、SSDは約1/100の時間でこれを実行できます。HDDは最大120IOPSを実行でき、安価なSSDは40,000 IOPSを実行でき、優れたSSDは230,000IOPSを実行できます。後者は、10時間よりも速い約12秒で400万のファイルを開くことができます。;)
  • すべてのファイルを1回だけ渡します。それでも遅いですが、2〜3倍速くなります。

注:より多くのスレッドを使用しても、ハードドライブの速度は上がりません。

于 2013-01-24T14:03:37.067 に答える
1

あなたが呼んでいる

thread.run();

それ以外の

thread.start();

これは、実際には別のスレッドでコードを実行していないことを意味します...

それ以外は、@Peterの回答を2番目にしたいと思います。

于 2013-01-24T14:08:37.670 に答える