在java中读取大型CSV

时间:2013-11-18 08:28:03

标签: java file-io opencsv

我想从CSV中读取大量数据,包含大约500,000行。 我正在使用OpenCSV库。我的代码是这样的

    CsvToBean<User> csvConvertor = new CsvToBean<User>();
    List<User> list = null;
    try {
        list =csvConvertor.parse(strategy, new BufferedReader(new FileReader(filepath)));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

最多200,000条记录,数据被读入用户bean对象列表。但是对于比我更多的数据

java.lang.OutOfMemoryError: Java heap space

我在“eclipse.ini”文件中有这个内存设置

-Xms256m
-Xmx1024m

我正在考虑将大文件拆分为单独文件并再次读取这些文件的解决方案,我认为这是一个很长的解决方案。

还有其他方法可以避免OutOfMemoryError异常。

3 个答案:

答案 0 :(得分:12)

逐行阅读

类似这样的事情

    CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
    String [] nextLine;
    while ((nextLine = reader.readNext()) != null) {
        // nextLine[] is an array of values from the line
        System.out.println(nextLine[0] + nextLine[1] + "etc...");
    }

答案 1 :(得分:1)

您必须为应用设置-Xmx值,而不是在这种情况下使用eclipse。在“运行配置”中,选择您的应用程序,然后转到“参数”选项卡,并在“VM参数”中设置该值,例如-Xmx1024m。 您可以通过右键单击要运行的文件来打开运行配置,然后选择“运行方式”,然后选择“运行配置...”

答案 2 :(得分:0)

在下面的示例中,您可以从csv文件中读取n条记录。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ReadCSV 
{
    public static void main(String[] args) 
    {
        String csvFile = "C:/Users/LENOVO/Downloads/Compressed/GeoIPCountryWhois.csv";
        BufferedReader br = null;
        String line = "";
        String cvsSplitBy = ",";

        try 
        {
            br = new BufferedReader(new FileReader(csvFile));
            while ((line = br.readLine()) != null) 
            {
                // use comma as separator
                String[] country = line.split(cvsSplitBy);

                System.out.println("Country [code= " + country[4] + " , name=" + country[5] + "]");
            }

        }
        catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        } 
        finally 
        {
            if (br != null) 
            {
                try 
                {
                    br.close();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("Done");
    }
}