读取java中的小CSV文件导致内存不足错误

读取java中的小CSV文件导致内存不足错误,java,csv,opencsv,Java,Csv,Opencsv,我有以下两个读取csv文件的实现,有问题的csv文件没有那么大(5兆字节) 第一个实现使用openCSV,第二个实现使用stringTokenizer 第一个错误导致了内存不足错误,即使我将java max堆内存提高到1G(Xmx),尽管StringTokenizer实现并不健壮,但我别无选择,因为我需要将csv文件读入内存 我不明白为什么openCSV版本会消耗这么多内存,因为csv文件的大小很小(它有200000行,但只有大约5m的文件大小)。openCSV阅读器在做什么,需要这么多内存?S

我有以下两个读取csv文件的实现,有问题的csv文件没有那么大(5兆字节)

第一个实现使用openCSV,第二个实现使用stringTokenizer

第一个错误导致了内存不足错误,即使我将java max堆内存提高到1G(Xmx),尽管StringTokenizer实现并不健壮,但我别无选择,因为我需要将csv文件读入内存

我不明白为什么openCSV版本会消耗这么多内存,因为csv文件的大小很小(它有200000行,但只有大约5m的文件大小)。openCSV阅读器在做什么,需要这么多内存?StringTokenizer版本很快就通过了它

以下是openCSV实现引发的错误:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.Arrays.copyOfRange(Arrays.java:3209)
    at java.lang.String.<init>(String.java:215)
    at java.lang.StringBuilder.toString(StringBuilder.java:430)
    at au.com.bytecode.opencsv.CSVParser.parseLine(Unknown Source)
    at au.com.bytecode.opencsv.CSVParser.parseLineMulti(Unknown Source)
    at au.com.bytecode.opencsv.CSVReader.readNext(Unknown Source)
线程“main”java.lang.OutOfMemoryError中出现异常:超出GC开销限制 位于java.util.Arrays.copyOfRange(Arrays.java:3209) 位于java.lang.String。(String.java:215) 位于java.lang.StringBuilder.toString(StringBuilder.java:430) 在au.com.bytecode.opencsv.CSVParser.parseLine(未知源代码) 在au.com.bytecode.opencsv.CSVParser.parseLineMulti(未知源代码) 在au.com.bytecode.opencsv.CSVReader.readNext(未知源代码)
私有列表解析CSV(文件f){
Listres=新向量();
CSVReader reader=null;
试一试{
reader=new CSVReader(new BufferedReader(new FileReader(f));
字符串[]下一行;
而((nextLine=reader.readNext())!=null){

对于(int i=0;i可能不太可能,但我猜您的输入数据可能会触发opencsv库中的错误,可能导致它陷入循环

opencsv的下载提供了源代码和库,因此您应该能够自己调试代码


由于stacktrace没有显示opencsv代码的行号,我想您可能需要在构建脚本中修改javac目标以包含“debug=true”,以启用代码的调试编译。

结果表明,StringTokenizer版本有一个bug,因此两个版本的内存都不足。

使用,因此我建议尝试一下。Solr使用它是一个很大的认可

private List<String[]> parseCSV(File f) {
    List<String[]>res=new Vector<String[]>();
    CSVReader reader=null;
    try{
        reader = new CSVReader(new BufferedReader(new FileReader(f)));
        String [] nextLine;
        while ((nextLine = reader.readNext()) != null) {
            for(int i=0;i<nextLine.length;i++)if(nextLine[i]!=null)nextLine[i]=nextLine[i].trim();
            res.add(nextLine);
        }

    }catch(IOException exp){
        exp.printStackTrace();
    }finally{
        if(reader!=null)try {
            reader.close();
        } catch (IOException ex) {
            Logger.getLogger(DataStream2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    return res;

}

 private List<String[]> parseCSV(File f) {
    List<String[]>res=new Vector<String[]>();
    BufferedReader br=null;
    try{
        br = new BufferedReader(new FileReader(f));
        String line =null;
        while((line=br.readLine())!=null){
            StringTokenizer st=new StringTokenizer(",");
            String[]cur=new String[st.countTokens()];
            for(int i=0;i<cur.length;i++){
                cur[i]=st.nextToken().trim();
            }
            res.add(cur);
        }
    }catch(IOException exp){
        exp.printStackTrace();
     }
    finally{
        if(br!=null)try {
            br.close();
        } catch (IOException ex) {
            Logger.getLogger(DataStream2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    return res;
}