我想从CSV中读取包含大约500000行的巨大数据。我正在使用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();
}
多达200000条记录,数据被读取到Userbean对象的列表中。但对于更多的数据,我得到了
java.lang.OutOfMemoryError: Java heap space
我在"eclipse.ini"文件中有这个内存设置
-Xms256m
-Xmx1024m
我正在考虑一个解决方案,将巨大的文件拆分为单独的文件,然后再次读取这些文件,我认为这是一个漫长的解决方案。
有没有其他方法可以避免OutOfMemoryError异常。
逐行读取
像这个
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...");
}
下面的示例通过从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");
}
}
您必须为应用程序设置-Xmx
值,而不是eclipse。在"运行配置"中,选择您的应用程序,然后转到"参数"选项卡,在"VM参数"中设置该值,例如-Xmx1024m
。右键单击要运行的文件,然后选择运行方式,然后选择"运行配置…",即可打开运行配置。