2012-07-03 52 views
0

我有一個非常巨大的csv文件,我必須使用一些選擇查詢,得到avg,...我不能通過逐行讀取,因爲內存不足。如何使用大的csv文件

下面的代碼在一個簡短的csv文件上很好地工作,但不是很大。 如果您可以編輯此代碼以用於大型csv文件,我將不勝感激。

import java.io.File; 

import java.io.FileNotFoundException; 
import java.util.Scanner; 


public class Mu { 
    public void Computemu() 
    { 
     String filename="testdata.csv"; 
     File file=new File(filename); 
     try { 
      Scanner inputstream=new Scanner(file);//Scanner read only string 
      // String data=inputstream.next();//Ignore the first line(header) 
      double sum=0; 
      double numberOfRating=0; 

      while (inputstream.hasNext()) 
      {      
       String data=inputstream.next();//get a whole line 
       String[] values= data.split(";");//values separate by; 
       double rating=Double.parseDouble(values[2].replaceAll("\"", ""));//change value to string 
       if(rating>0)//do not consider implicit ratings 
       { 
        sum+=rating; 
        numberOfRating++; 
       } 
      } 
      inputstream.close(); 
      System.out.println("Mu is"+ (sum/numberOfRating)); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+2

我不明白,爲什麼上面的代碼會導致一個OutOfMemoryError:它只有在一個時間內存一條線 –

+0

掃描儀是否負荷。整個文件首先進入內存?http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html –

回答

0

我建議在這個用例中使用Apache Commons FileUtil。這可能不是你在你的問題中尋找的,但是FileUtil的使用比重新實現它更可取。請注意0​​方法。

2

您沒有撥打useDelimiter,所以next()方法必須將整個文件加載到一個字符串中,如果它沒有空格(默認分隔符)。

這會導致OutOfMemory錯誤。

如果您想使用掃描儀,請根據您的需要設置分隔符。

但一個CSV庫(如csvfile很可能會更有效