我想讀取幾個大文件(超過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);
工作是否有可能該文件包含巨大的線?如果文件實際上不是文本文件,那很可能*。另外:你是否堅持'stat'方法中的任何數據? –
'stat()'方法做了什麼? –
請不要使用DataInputStream來讀取文本。不幸的是,這樣的例子會被一次又一次地複製,所以你可以從你的例子中刪除它。 http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –