我在 Java 中读取大型 CSV 文件时出现内存不足错误。我该如何处理这个问题。我增加了堆大小,我也尝试使用 BufferedReader,但仍然存在同样的问题。这是我的代码
public class CsvParser {
public static void main(String[] args) {
try {
FileReader fr = new FileReader((args.length > 0) ? args[0] : "data.csv");
Map<String, List<String>> values = parseCsv(fr, " ", true);
System.out.println(values);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Map<String, List<String>> parseCsv(Reader reader, String separator, boolean hasHeader)
throws IOException {
Map<String, List<String>> values = new LinkedHashMap<String, List<String>>();
List<String> columnNames = new LinkedList<String>();
BufferedReader br = null;
br = new BufferedReader(reader);
String line;
int numLines = 0;
while ((line = br.readLine()) != null) {
if (StringUtils.isNotBlank(line)) {
if (!line.startsWith("#")) {
String[] tokens = line.split(separator);
if (tokens != null) {
for (int i = 0; i < tokens.length; ++i) {
if (numLines == 0) {
columnNames.add(hasHeader ? tokens[i] : ("row_" + i));
} else {
List<String> column = values.get(columnNames.get(i));
if (column == null) {
column = new LinkedList<String>();
}
column.add(tokens[i]);
values.put(columnNames.get(i), column);
}
}
}
++numLines;
}
}
}
return values;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想把所有东西都加载到内存中,你就需要内存。
通过将完整文件加载到内存中,您将始终面临内存不足错误的风险。
如果您确实需要始终可访问所有数据,您可以开始考虑使用数据库。像 sqlite 这样的嵌入式数据库易于集成,开销很小,并且能够管理磁盘上的数据。这样,无论您的文件有多大,您都不会遇到内存问题。
| 归档时间: |
|
| 查看次数: |
6966 次 |
| 最近记录: |