我需要解析一個來自先前查詢的巨大ResultSet,我想出了一些東西,但它太慢了。ResultSet解析器太慢
public LinkedList<CountryFirstData> sortCountryFirst() throws SQLException {
long parsingStart = System.nanoTime();
LinkedList<CountryFirstData> list = new LinkedList<CountryFirstData>();
String serie;
String unit;
String country;
BigDecimal value;
int year;
int index;
while (rs.next()) {
serie = rs.getString(1); // rs is the previously built resultSet
unit = rs.getString(2);
country = rs.getString(3);
value = rs.getBigDecimal(4);
year = rs.getInt(5);
if ((index = list.indexOf(new CountryFirstData(country, serie, unit))) != -1) {
list.get(index).getDuo().add(new YearValueDuo(year, value));
}
else {
CountryFirstData data = new CountryFirstData(country, serie, unit);
data.getDuo().add(new YearValueDuo(year, value));
list.add(data);
}
}
long parsingEnd = System.nanoTime();
Collections.sort(list);
long sortEnd = System.nanoTime();
System.out.println("Parsing Time = " + ((parsingEnd - parsingStart)/1000000000)); // gives 112s
System.out.println("Sorting Time = " + ((sortEnd - parsingEnd)/1000000000)); // gives 0s
return list;
}
我會盡量解釋一下代碼:
ResultSet中列包含5個不同的值。第一個要考慮的三人組成爲country
,serie
和unit
。當我第一次得到這樣一個三人組(else
案例)時,我需要創建一個新的CountryFirstData
,並將resultSet行中的剩餘年份/值添加到創建的對象中的YearValueDuo
列表字段。
當三人country
,serie
和unit
在list
(if
情況下)已經存在,我需要找回它,兩人年/值添加到其YearValueDuo
名單。
所以,基本上,resultSet rs是4000行,整個解析(排除排序)需要2分鐘。我覺得這隻有4k線太多了。排序仍然很快(不到一秒)。
我選擇LinkedList
代替CountryFirstData
而不是ArrayList
,因爲後來我按順序在文件中寫入了整個列表(這非常快)。
你們可以建議我一些改進嗎?
你爲每一行執行''list.indexOf(new CountryFirstData(country,serie,unit))''''。根據「CountryFirstData.equals」的複雜程度,當「list」有3999個條目時,這可能需要很長時間。嘗試測量每個行的「indexOf」方法的時間。 – f1sh
@ f1sh Will do,ty。我還沒有找到更好的方法來測試列表中是否存在指定的'CountryFirstData'。 – Fitz
比較(在列表中)一個對象實例,添加另一個對象似乎很難看。 –