在java中读取大型CSV文件(数百万行)时出现内存不足错误

Ano*_*hal 5 java csv

我在 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)

Con*_*ion 1

如果你想把所有东西都加载到内存中,你就需要内存。

通过将完整文件加载到内存中,您将始终面临内存不足错误的风险。

如果您确实需要始终可访问所有数据,您可以开始考虑使用数据库。像 sqlite 这样的嵌入式数据库易于集成,开销很小,并且能够管理磁盘上的数据。这样,无论您的文件有多大,您都不会遇到内存问题。