4

これに関連する可能性のある別の質問がありますが、回答がなく、質問者は明確にしませんでした。

そのため、postgres で大きな結果セットを調べていると、Java が壊れているように見えます。

私が実行しているクエリは、約 550 万行を取得しようとしています。基本的に、Postgres db から Neo4J データベースを作成しようとしています。

かなり一般的だと思うので、誰かが尋ねない限り、わざわざコードを投稿するつもりはありません。例外出力は次のとおりです。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Unknown Source)
    at java.lang.Class.getDeclaredField(Unknown Source)
    at java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<init>(Unknown Source)
    at java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater(Unknown Source)
    at java.sql.SQLException.<clinit>(Unknown Source)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1818)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
    at sqlToGraph.SqlToGraph.main(SqlToGraph.java:52)

52 行目は単なるクエリです。

rs = st.executeQuery("select player_lo, player_hi, total_hands_lo, total_hands_hi, (pc_lo + pc_hi)/2 as avg_pc from pair");

だから私はrsがかなり大きくなっていると思います。LIMIT と OFFSET を使用して、プログラムを数百回実行するか、またはループで rs をリセットすることができると思いますが、そうする必要はありません。

4

1 に答える 1

9
  1. フェッチ サイズを適切な値に設定します ( st.setFetchSize(rowCount))。これを試すことができます。
  2. 自動コミットをオフにして、すべてをトランザクションに入れます ( con.setAutoCommit(false))。

この説明ドキュメントを参照してください。

于 2012-06-18T15:38:54.783 に答える