2016-10-03 89 views
0

我想讀取CSV文件,從每行創建對象,然後將這些對象保存到數據庫中。 當我從我的文件中讀取所有行,並將所有對象存儲在ArrayList中時,我得到Java堆空間錯誤。 我試着在讀完之後立即保存每一條記錄,但之後通過Hibernate方法save()保存記錄需要很多時間。閱讀大文件(Java堆空間)

我也試着檢查我的arrayList的大小,並保存數據,當這個大小等於100k(註釋部分代碼)。

問題:有什麼方法可以部分讀取文件或更好的方式來存儲數據在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個對象的緩衝區,然後在一個查詢中將其保存到數據庫中? (與hibernate的Im unfamilair,但最有可能這將是可能的)這是所有關於找到正確的緩衝區大小,也許寫一個方法接受一個int緩衝區,並動態地使用它。然後根據您的使用情況,您可以使用不同的緩衝區大小並找到最優化的緩衝區。由於每臺計算機的RAM都是可變的,因此沒有固定的理想緩衝區大小來最優地將數據插入數據庫。 正在使用哪臺服務器,這些數據量的數據永遠都不是這樣的情況下 – engineercoding

+0

?你需要增加最大堆大小。 –

回答