【问题标题】:Using opencsv - java.lang.OutOfMemoryError: Java heap space使用 opencsv - java.lang.OutOfMemoryError:Java 堆空间
【发布时间】:2014-01-18 08:36:45
【问题描述】:

我正在使用opencsv 来解析两个 csv 文件。我只从这两个文件中复制一些值。

我有一个单独的函数来处理CDax.csv。看起来像这样:

public HashMap<String,String> readCDax() throws Exception {
    String csvDaxFile = "C:\\Users\\CDAX.csv";

    CSVReader reader = new CSVReader(new FileReader(csvDaxFile), ';');
    String [] line;
    HashMap<String, String> cdaxMap = new HashMap<String, String>();

    while ((line = reader.readNext()) != null) {            
        cdaxMap.put(line[0], line[7]);
    }

    System.out.println("Process CDax File!");

    reader.close();
    return cdaxMap;
}

我的主要方法是run(),我在我的主要方法中执行:

public void run() 抛出异常 {

while ((firstLine = reader.readNext()) != null && (secondLine = reader.readNext()) != null && i<10) {            

    //fileName of the String
    fileName = firstLine[0];

    writerPath = "C:\\Users\\" + fileName + ".csv";
    //write csv file
    CSVWriter writer = new CSVWriter(new FileWriter(writerPath), ';');

    //write Header
    //String[] entries = "Name;Date;TotalReturn;Currency".split(";");
    String [] entries = {"Name","Date", "TotalReturn", "Currency"};

    writer.writeNext(entries);

    //create Content

    //companyName of the String
    companyName = secondLine[1];

    //currency
    currency = secondLine[2];

    //dates
    dateList = new ArrayList<String>();
    for(int p = 3; p < firstLine.length; p++) {
        dateList.add(firstLine[p]);
    }

    //total returns
    returnList = new ArrayList<String>();
    for(int j = 3; j < secondLine.length; j++) {
        returnList.add(secondLine[j]);
    }

    // cDaxList
    cDaxList = new ArrayList<String>();
    for(int j = 1; j <dateList.size(); j++) {
        if(cDaxMethodValuesMap.containsKey(dateList.get(j))){
            cDaxList.add(cDaxMethodValuesMap.get(dateList.get(j)));
        } else{
            dateList.add("na"); // I get the error here!
        }
    }

    if(dateList.size()!=returnList.size()) {
        System.out.println("Dates and Returns do not have the same length!");
    }

    int minSize = Math.min(dateList.size(), returnList.size());

    //"Name;Date;TotalReturn;Currency"
    List<String[]> data = new ArrayList<String[]>();
    for(int m = 0; m < minSize; m++) {
        data.add(new String[] {companyName, dateList.get(m), returnList.get(m), currency, cDaxList.get(m)});
    }

    writer.writeAll(data);

    //close Writer
    writer.close();

    i++;
    System.out.println(fileName + " parsed successfully!");


}
System.out.println("Done");

}

但是当我运行我的程序时,我得到:

Process CDax File!
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2760)
    at java.util.Arrays.copyOf(Arrays.java:2734)
    at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
    at java.util.ArrayList.add(ArrayList.java:351)
    at com.TransformCSV.main.ParseCSV.run(ParseCSV.java:109)
    at com.TransformCSV.main.ParseCSV.main(ParseCSV.java:21)

我在这个方法中遇到了错误:

cDaxList = new ArrayList<String>();
for(int j = 1; j <dateList.size(); j++) {
    if(cDaxMethodValuesMap.containsKey(dateList.get(j))){
        cDaxList.add(cDaxMethodValuesMap.get(dateList.get(j)));
    } else{
        dateList.add("na"); //I get the error here!!!
    }
}

我尝试通过 vm 设置设置堆大小,但我认为不应该这样做,因为我只在两个 csv 文件中读取 3000 值。

感谢您的回复!

【问题讨论】:

  • 您是否打印了 dateList size() 以查看应用程序实际上被推到了它众所周知的喉咙里?我相信您该文件仅包含 3000 个值,但我不会假设处理数据实际上是正确的。

标签: java eclipse csv opencsv


【解决方案1】:

你的循环:

for(int j = 1; j <dateList.size(); j++) {

正在循环通过dateList,但在该循环中您将添加到dateList

dateList.add("na"); //I get the error here!!!

所以dateList 会越来越大,直到内存不足。 dateList.size() 每次循环都会被评估,而不是在开始时评估一次。

【讨论】:

  • 非常感谢您的回复!我现在修好了;)
猜你喜欢
  • 2010-12-08
  • 2015-05-14
  • 2019-07-10
  • 2019-12-12
相关资源
最近更新 更多