2016-10-03 13 views
0

CSVファイルを読み込み、すべての行からオブジェクトを作成し、これらのオブジェクトをデータベースに保存します。 ファイルからすべての行を読み込み、ArrayList内にすべてのオブジェクトを格納すると、Javaヒープスペースエラーが発生します。 読み込み直後にすべてのレコードを保存しようとしましたが、Hibernateメソッドsave()でレコードを保存するのに時間がかかります。大きなファイル(Javaヒープスペース)の読み込み

また、このサイズが100k(コードのコメント部分)に等しい場合、arrayListのサイズを確認してデータを保存しようとしました。

質問:Javaでデータを格納するために、ファイルを部分的にまたはより良い方法で読み取る方法はありますか?あなたは本当に大きなファイルを処理したい場合は、最大ヒープサイズの

String[] colNames; 
String[] values; 
String line; 
Map<Object1, Object1> newObject1Objects = new HashMap<Object1, Object1>(); 
Map<Object1, Integer> objIdMap = objDao.createObjIdMap(); 

    StringBuilder raportBuilder = new StringBuilder(); 
    Long lineCounter = 1L; 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       new FileInputStream(filename), "UTF-8")); 
     colNames = reader.readLine().split(";"); 
     int columnLength = colNames.length; 

     while ((line = reader.readLine()) != null) { 
      lineCounter++; 
      line = line.replace("\"", "").replace("=", ""); 
      values = line.split(";", columnLength); 

      // Object1 
      Object1 object1 = createObject1Object(values); 
      if (objIdMap.containsKey(object1)) { 
       object1.setObjId(objIdMap.get(object1)); 
      } else if (newObject1Objects.containsKey(object1)) { 
       object1 = newObject1Objects.get(object1); 
      } else { 
       newObject1Objects.put(object1, object1); 
      } 

      // ============================================== 
      // Object2 
      Object2 object2 = createObject2Object(values, object1, 
        lineCounter, raportBuilder); 
      listOfObject2.add(object2); 
      /* 
      logger.error("listOfObject2.size():"+listOfObject2.size()); 
      if(listOfObject2.size() % 100000 == 0){ 
       object2Dao.performImportOperation(listOfObject2); 
       listOfObject2.clear(); 
      } 
      */ 
     } 
     object2Dao.performImportOperation(listOfObject2); 
+1

おそらく0〜50個のオブジェクトのバッファを使用し、それを1つのクエリでデータベースに保存しますか? (私は休止状態では不公平ですが、可能性が高いと思われます)正しいバッファサイズを見つけることが大切です。intバッファを受け取り、それを動的に使用するメソッドを書くかもしれません。あなたの用途に応じて、さまざまなバッファサイズで再生し、最適なものを見つけることができます。 RAMはコンピュータごとに可変であるため、データをデータベースに最適に挿入するための理想的なバッファサイズは固定されていません。 これらのデータ量を使用すると、どちらのサーバーを使用しているのですか?高速であることはありません。 – engineercoding

+0

最大ヒープサイズを大きくする必要があります。 –

答えて

関連する問題