0

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

4

2 に答える 2