2011-11-03 98 views
3

我想讀取幾個大文件(超過100MB)。到目前爲止,它總是在OutofMemory錯誤的中間崩潰。有沒有解決辦法?OutofMemoryError讀取大文件時

  FileInputStream fstream = new FileInputStream(f); 
      // Get the object of DataInputStream 
     DataInputStream dain = new DataInputStream(fstream); 
     // BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

     BufferedReader in = new BufferedReader(new InputStreamReader(dain)); 
     String text = in.readLine(); 
     while(text != null) { 
      stat(text); 
      text = in.readLine(); 
     } 

例外情況是這樣的:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOfRange(Arrays.java:2694) 
at java.lang.String.<init>(String.java:234) 
at java.io.BufferedReader.readLine(BufferedReader.java:349) 
at java.io.BufferedReader.readLine(BufferedReader.java:382) 

這裏是統計的作用:

public void stat(String text) { 
    String postTypeId = this.getXmlValue(text, "PostTypeId"); 
    String viewCountStr = this.getXmlValue(text, "ViewCount"); 
    String answerCountStr = this.getXmlValue(text, "AnswerCount"); 
    String userId = this.getXmlValue(text, "OwnerUserId"); 
    String postId = this.getXmlValue(text, "Id"); 
    String parentId = this.getXmlValue(text, "ParentId"); 
    String backUpId = this.getXmlValue(text, "LastEditorUserId"); 
    //Add post rel 
    if(parentId==null) { 
     if(!postTable.containsKey(postId)) 
      postTable.put(postId, new PostRel()); 
    } else { 
     try{ 
     postTable.get(parentId).addAnswer(postId); 
     }catch(Exception exp) { 
     } 
    } 
       generalCount(postTypeId,viewCountStr,answerCountStr,userId,postId,parentId,backUpId); 

}

並在generalCount,我試圖插入另一個表:

  if(userTable.containsKey(userId)) { 
     userTable.get(userId).addPost(postId); 
     if(parentId!=null) 
      userTable.get(userId).addAnswer(parentId); 
    } else{ 
     UserPostInfo newInfo = new UserPostInfo(); 
     newInfo.addPost(postId); 
     if(parentId!=null) 
      newInfo.addAnswer(parentId); 
     userTable.put(userId, newInfo); 
+4

工作是否有可能該文件包含巨大的線?如果文件實際上不是文本文件,那很可能*。另外:你是否堅持'stat'方法中的任何數據? –

+2

'stat()'方法做了什麼? –

+0

請不要使用DataInputStream來讀取文本。不幸的是,這樣的例子會被一次又一次地複製,所以你可以從你的例子中刪除它。 http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

回答

13
  1. Give the JVM more memory to work with
  2. 使用較少的內存,同時讀取文件(你能用數據流工作呢?)
  3. memory-mapped files
+3

我喜歡你的無廢話點的樣式。 – Adamski

+0

非常感謝您的回覆,您是否可以更加專注於流數據選項?我對此不太瞭解。我讀的文件是由stackoverflow提供的數據文件,它是XML格式的,我認爲它們應該沒問題,因爲它可能是從Stackoverflow的數據庫自動生成的。我沒有在stat方法中存儲數據,stat方法從行中獲取一些信息,並將它們存儲到散列表中,我認爲這不會浪費太多內存。 – faz

+1

@faz哈希表幾乎肯定是罪魁禍首。我以前陷入了這個陷阱。請編輯您的問題以顯示 - 至少在高級別 - stat()'做了什麼。 –