2016-08-10 9 views
2

使用IDE IDE:Netbeans 8.1。例外java.lang.OutOfMemoryError:Javaヒープスペース

MySQLデータベースから大きなデータを読み込む。以下は私のコードです:

List outer=new ArrayList<String>(); 
List inner=new ArrayList<String>(); 
Connection con; 
Statement stmt; 
ResultSet rs; 
ResultSetMetaData rsmd; 
int columnNumber; 
try{ 
    Class.forName("com.mysql.jdbc.Driver"); 
    con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root"); 
    stmt=con.createStatement(); 
    rs=stmt.executeQuery("select * from mytable where srno<1000"); 
    rsmd=rs.getMetaData(); 
    columnNumber=rsmd.getColumnCount(); 
    while(rs.next()){ 
     for(int i=1;i<columnNumber;i++){ 
      inner.add(rs.getString(i)); 
     } 
     outer.add(inner); 
    }   
    System.out.println("\t" + outer); 
    rs.close(); 
    con.close(); 
}catch(Exception e){ 
    System.out.println(e); 
} 

コードを実行している間、私はエラーを取得しています:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

私はプロパティでVMオプションを設定しようとした>実行> VMオプション:-Xmx1024m

私ははそれでも同じエラーが発生します。どうすれば解決できますか?

+0

小さいテーブルをクエリするか、WHERE句を使用してデータの量を戻します。より多くのRAMを搭載した64ビットJVMを実行します。それだけであなたができることです。 – duffymo

+0

それをしました。しかし、まだ同じエラーが発生しています。 –

+0

選択結果の詳細:行数いくつの列?各列の内容の平均サイズ? – Aris2World

答えて

4

はちょうどこのコードを見て:表の行ごと

while(rs.next()){ 
    for(int i=1;i<columnNumber;i++){ 
     inner.add(rs.getString(i)); 
    } 
    outer.add(inner); 
    } 

、あなたはリストに、各列の値を追加すると、それらの各リストは、あなたが別のリストに追加しています。したがって、テーブルに100万行があり、各行に5つの列がある場合。 5百万行を作成しています。記憶が枯渇しているのは驚きですか?あなたの更新によると、実際には10百万行と45列です。あなたは4億5千万の物を作っていることを理解していますか?

また、外側のリストの各項目は、オブジェクトのヘッダーなどのためにデータベースで使用されたスペースの容量よりも多くの領域を占めることに注意してください。

これは何のためのものなのか説明しました。たとえば、スイングアプリの場合は、適切なTableModelを選択して、データベース全体を一度に読み込まないようにすることができます。

+0

ああ私の間違い。私はリスト全体に行を格納したいと思っていたし、複数の行があるので、このようにしました。 –

+3

完全に異なる戦略が必要です。 – e4c5

+3

私は@ e4c5に同意します。あなたはdb(怠惰リストまたはページ付けされたリスト)から読んでいる間にデータを使用する必要があります。潜在的な無制限のデータソースからメモリデータをロードすることは決して良い戦略ではありません。 – Aris2World

関連する問題