前のクエリーから巨大な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
リストにデュオ年/値を追加する必要があります。
したがって、結果セットrsの長さは4000行で、解析(ソート除外)全体は2分かかります。私はこれが唯一の4k行のためにあまりにも多いように感じる。ソートはまだ高速です(1秒未満です)。
CountryFirstData
の場合はArrayList
を選択しましたが、後でそのリスト全体をファイル内にその順序で書き込みます(これは本当に速いです)。
あなたは私にいくつか改善を提案できますか?
各行に '' list.indexOf(新しいCountryFirstData(国、セリ、ユニット)) ''を実行します。 '' CountryFirstData.equals''の複雑さによっては、 '' list''が3999個のエントリを持つときにはかなり時間がかかるかもしれません。 '' indexOf''メソッドが各行にかかる時間を測定しようとします。 – f1sh
@ f1shするでしょう。指定された 'CountryFirstData'がすでにリストに存在するかどうかをテストするより良い方法は見つけられませんでした。 – Fitz
(リストで)オブジェクトの1つのインスタンスを比較し、もう一方を追加すると醜いようです。 –