2011-10-21 65 views
2

我工作在Java中的數據分析程序的值加倍,然後做計算。數據來自汽車傳感器,並以CSV格式提供。它需要讀取,解析爲加倍然後「轉換」(例如從5/12伏特值到G力/英里/%節氣門開度/%制動力等)。數據文件的大小將高達約200MB。優化/併發JAVA:讀CSV文件,解析數據對

我目前正在做的是用BufferedReader讀取數據,用indexOf()和substring()分割tokenz,用parseDouble解析它們爲double,將它們添加到ArrayList的ArrayList中(double ArrayList)每個令牌,最多有20個令牌)。數組列表後,我必須轉換雙打,這意味着對每個值使用多項式(這似乎佔用了大部分時間,超過2/3)。

整個序列是240條000線,20代幣的採樣數據大約7秒。我想知道如何改善這一點。我一直在考慮使用流和併發來進行文件讀取和解析,但似乎最大的問題是多項式數學。我用來計算轉換後的值的代碼是:

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

其中polX是多項式,值是我要轉換的雙值。這當然是不同的,這取決於我有多少多項式可用。

所以,研究結果作出任何意義嗎?如果是這樣,有關如何改善此過程的性能的任何建議?

感謝您提供了許多有用的網站。 :-)

+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

是的,我同意;你也可以拿走前面的力量的產物;恩。如果您precalc pol2'= pol2 /(pol1 * pol1),那麼您可以使用pol0 +(pol1 * value)+(pol2'*(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