2017-11-18 2 views
0

ArrayListにDBクエリのResultSetを保存しようとしていますが、ファイルへの入力として使用されますが、メモリが不足しています。私が読んでいるテーブルには約116k行のデータがあります。私はreadDB()メソッド内のファイルに直接書き込もうとしました。約3.3 MBのCSVファイルを作成します。これは私のコードです。ファイルを書き込むための入力として使用するResultSetを保存する

public class Main { 

    public static void main(String[] args) { 

     DBAccess dbAccess = new DBAccess(); 

    } 
} 

DBを読み取るクラスとメソッド。このため

import java.sql.*; 
import java.util.ArrayList; 
import java.util.List; 

public class DBAccess { 

    public List<String> readDB() { 

     String url = "jdbc:Cobol://Dev/Project Files/DatAndCpyFiles"; 


     try (Connection con = DriverManager.getConnection(url, "", ""); 
      Statement stmt = con.createStatement()) 

     { 

      stmt.setFetchSize(10); 

      Class.forName("com.hxtt.sql.cobol.CobolDriver").newInstance(); 


      String sql = "select * from PROFS"; 


      ResultSet rs = stmt.executeQuery(sql); 


      List<String> result = new ArrayList<>(); 

      ResultSetMetaData resultSetMetaData = rs.getMetaData(); 
      int iNumCols = resultSetMetaData.getColumnCount(); 
      for (int i = 1; i <= iNumCols; i++) { 
       result.add(resultSetMetaData.getColumnLabel(i) + ";"); 
      } 
      String row; 

      while (rs.next()) { 
       for (int i = 1; i <= iNumCols; i++) { 

        row = rs.getString(i); 

        row = row == null ? " " : row.replaceAll("\u0086", "å"); 
        row = row == null ? " " : row.replaceAll("\u008F", "Å"); 
        row = row == null ? " " : row.replaceAll("\u0084", "ä"); 
        row = row == null ? " " : row.replaceAll("\u008E", "Ä"); 
        row = row == null ? " " : row.replaceAll("\u0094", "ö"); 
        row = row == null ? " " : row.replaceAll("\u0099", "Ö"); 
        row = row == null ? " " : row.replaceAll("\u0081", "ü"); 
        row = row == null ? " " : row.replaceAll("\u009A", "Ü"); 
        row = row == null ? " " : row.replaceAll("\u0082", "é"); 
        row = row == null ? " " : row.replaceAll("\u0090", "É"); 

        result.add(result + row.trim() + ";"); 
       } 
      } 

      rs.close(); 
      System.out.println("Returning result"); 

      return result; 

     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

エラーメッセージ

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:3332) 
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124) 
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448) 
    at java.lang.StringBuilder.append(StringBuilder.java:136) 
    at java.lang.StringBuilder.append(StringBuilder.java:131) 
    at java.util.AbstractCollection.toString(AbstractCollection.java:462) 
    at java.lang.String.valueOf(String.java:2994) 
    at java.lang.StringBuilder.append(StringBuilder.java:131) 
    at se.spedweb.DBAccess.readDB(DBAccess.java:56) 
    at se.spedweb.Main.main(Main.java:15) 

他にどのようなデータ構造ができ、私は?私はこれに間違ったアプローチを使用していますか?私はちょうどaddの代わりにaddのファイルにappendすることができましたが、私はそれがファイルに書き込んで別のクラスでデータベースを読むことがきれいになると思っていました。

+0

それを変更する方法を説明します場合は、それを行う方法がありますデシベルリーダーにライターを渡し、コールバックを使用することを検討してください(とに1行でライターにコールバック時間)。次に、読取りロジックから分離された実際の書込みロジック(行のシリアライズ)があります。 –

+0

ここでは、結果セット全体をメモリにロードしようとしています。 – EJP

+0

'String sql =" select * from PROFS ";'値がより根本的な 'PROFS'テーブルの中にある場合、これは間違っているかもしれません。 –

答えて

0

コマンドラインオプションでjavaを実行する場合は、-Xmxを使用してください。手動でヒープのサイズを設定できます。 -Xmx2048mに設定してみてください。 注:IDEを使用して、簡単にGoogleは

関連する問題