簡體   English   中英

讀取大文件(Java堆空間)

[英]Read large file (Java Heap Space)

我想讀取CSV文件,從每一行創建對象,然后將這些對象保存到數據庫中。 當我從文件中讀取所有行並將所有對象存儲在ArrayList中時,出現Java堆空間錯誤。 我試圖在讀取后立即保存每條記錄,但是通過Hibernate方法save()保存記錄會花費很多時間。

我還嘗試檢查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);

如果要處理很大的文件,最大堆大小的增加將無濟於事。 您的朋友正在batching

Hibernate不會隱式使用JDBC批處理,並且每個INSERT和UPDATE語句都是分別執行的。 閱讀“如何在休眠中啟用批量插入?” 獲取有關如何啟用它的信息。

注意IDENTITY生成器,因為它會禁用批量獲取

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM