2011-10-21 20 views
2

Javaのデータ解析プログラムで作業しています。データは車のセンサからのもので、CSV形式で配信されます。読み込み、解析して2倍に変換する必要があります(たとえば、5/12ボルトの値からG-forces/mph /%スロットル開度/%制動力など)。データファイルは最大約200MBのサイズになります。最適化/並行性JAVA:CSVファイルを読み込み、データを解析して値を計算します。

私は現在、BufferedReaderでデータを読み込み、indexOf()とsubstring()でtokenzを分割し、parseDoubleで2倍に解析し、2倍のArrayListのArrayListに追加します各トークンには、最大約20のトークンがあります)。 arraylistsが作成された後、私は各値に多項式を使用することを意味するdouble型を変換する必要があります(これは、ほとんどの時間を費やしているようですが、2/3以上)。

20トークンの240,000行のサンプルデータの場合、シーケンス全体は約7秒です。私はこれをどのように改善できるのだろうかと思っています。私はファイルの読み込みと解析にストリームと並行処理を使用することを考えてきましたが、最大の問題は多項式の数学のようです。変換された値を計算するために使用しているコードは次のとおりです。

pol0 + pol1 * value + pol2 * Math.pow(value, 2) + pol3 * Math.pow(value, 3) 
     + pol4 * Math.pow(value, 4); 

ここで、polXは多項式であり、値は変換するdouble値です。これはもちろん、使用可能な多項式の数によって異なります。

だから、これは意味がありますか?もしそうなら、このプロセスのパフォーマンスを改善する方法に関する提案はありますか?

多くの有益なユーザーを抱えてくれてありがとうございます。 :-)

+1

は、最初にアプリケーションをプロファイリングするために優れていることができますか?あなたのコードに実際のボトルネックを示すことができる良いJavaプロファイラがたくさんあります。 – xappymah

+0

また、多くの読み込みと比較すると、値の解析、ArrayListの作成(および拡張と思われる)多項式の数式は、コードの中で最も遅い部分ではないようです。 – xappymah

+0

これは、 Math.powを削除すると、実行時間は半分になります。私は、最も遅い部分が現在、部分文字列と解析であることを確信しています。パフォーマンスは要件仕様と比較してすぐれているので、あまり心配していません。私はすぐに最大サイズでArrayListを作成しようとしましたが、パフォーマンスを大幅に向上させるようには見えませんでした(約3100msから合計3000msまで)。 – lauritz

答えて

2

Math.pow(value, 2)はかなり高価です。これはlog + expを使用します。代わりに、はるかに高速なプレーンな乗算を使用することができます。

double value2 = value * value; 
double value3 = value * value2; 
double value4 = value2 * value2; 
double p = pol0 + pol1 * value + pol2 * value2 + pol3 * value3 
    + pol4 * value4; 

別のアプローチは、あなたが、二重の

double p = (((pol4 * value + pol3) * value + pol2) * value + pol1) * value + pol0; 

のArrayListを行くように乗算することで、高価な構造(主にオーバーヘッド)です。それは倍の[]より数倍大きい。

double[] buffer = new double[1024]; 
List<double[]> list = new ArrayList<>(): 
while((line = ....) { 
    int used = 0; 
    // found a double 
    buffer[used++] = Double.parseDouble(); 
    double[] doubles = new double[used]; 
    System.arraycopy(buffer,0,doubles,0,used); 
    list.add(doubles); 
} 
+1

はい、同意します。あなたは前のパワーの製品も取ることができます。例。 pol2 =(pol1 * value)+(pol1 * value)+(pol1 * value)*値を使用してMathを回避することができます。pow – memetech

+0

このアプローチを最初のケースで使用する理由は、CPUが 'value3'と' value4'を並列に計算できるからです。 –

+0

ありがとう、私は代わりに配列を使用して調べます。これは実行時間やメモリ使用量を中心に役立ちますか? – lauritz

0

多項式計算のためのより効率的な方法があります:

double r = pol4; 
r = value*r + pol3; 
r = value*r + pol2; 
r = value*r + pol1; 
r = value*r + pol0; 
+0

私は今この方法を使っていますが、7200msから3200msになりました。おかげさまで、APIに実際にどのようなことがあるかを覚えておいてください(Math.powは明らかにそれほど高速ではありません)。 – lauritz

関連する問題