JavaでCachedRowSetImplクラスを使用するのは非常に困難です。~35,000,000 行と 3 つの整数列を含む巨大な postgres テーブルのデータを分析したいと考えています。
すべてをコンピュータの物理メモリにロードできないため、これらの行を 100000 行のバッチごとに読み取りたいと考えています。psql プロンプトまたは pgadmin などのグラフィカル インターフェイスで対応するクエリ (テーブル制限 10000 から col1、col2、col3 を選択) を実行すると、100000 行と数メガバイトのメモリをロードするのに約 4000 ミリ秒かかります。
次のJavaコードで同じ操作を試みます:
CachedRowSet rowset = new CachedRowSetImpl();
int pageSize=1000000;
rowset.setCommand("select pk_lib_scaf_a,pk_lib_scaf_b,similarity_evalue from from_to_scaf");
rowset.setPageSize(pageSize);
rowset.setReadOnly(true);
rowset.setFetchSize(pageSize);
rowset.setFetchDirection(ResultSet.FETCH_FORWARD);
rowset.execute(myConnection);
System.out.println("start !");
while (rowset.nextPage()) {
while (rowset.next()) {
//treatment of current data page
} // End of inner while
rowset.release();
}
上記のコードを実行すると、「start !」メッセージはコンソールに表示されず、実行はrowset.execute()行でスタックしているようです。さらに、メモリ消費量が異常になり、コンピュータの物理メモリ (8 GB) の限界に達します。
これは奇妙です。プログラムは、pageSize 構成を考慮せずに、行セットを ~35,000,000 行で埋めようとしているようです。
Java JDBC および postgres ドライバーでこのような問題が発生した人はいますか? 何が恋しいですか?
postgres 9.1 Java jdk 1.7