首页 > 解决方案 > 循环通过中等大小的数据集时 Kotlin 中的内存不足错误

问题描述

我在 Kotlin 中运行以下循环并抛出内存不足错误。我正在运行它来读取 csv 文件中的行。“记录”的大小为 6422。

fun readCSVFile(filePath: String): List<String> {
    val reader = FileReader(filePath)
    val records = CSVFormat.DEFAULT.parse(reader)
    val rows = mutableListOf<String>()

    var output = ""
    records.forEach() {
        val size = it.size()
        for (i in 0 until it.size()-1) {
            output = output + it.get(i) + ","
        }
        output.dropLast(1)
        rows.add(output)
    }
    return rows
}

下面是我得到的例外。

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at trivago.ti.tools.FileProcessor.readCSVFile(FileProcessor.kt:16)
at trivago.ti.tools.ComparatorMainKt.main(ComparatorMain.kt:25)

我在 Java 中执行相同的逻辑,但它工作正常。以下是我在 Java 中的内容。

private static List<String> readCSVFile(String filePath) throws IOException {
    Reader in = new FileReader(filePath);
    Iterable<CSVRecord> records = CSVFormat.DEFAULT.parse(in);
    List<String> rows = new ArrayList<>();
    for (CSVRecord record : records) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < record.size(); i++)
            builder.append(record.get(i) + ",");
        builder.deleteCharAt(builder.length() - 1);
        rows.add(builder.toString());
    }
    return rows;
}

为什么 Kotlin 有这个问题?我在循环中做错了吗?任何帮助将不胜感激,因为我是 Kotlin 的新手。

标签: javamemorykotlinjvmout-of-memory

解决方案


我认为您的代码中存在错误

records.forEach() {
    output = "" // clear output ;)
    ...
}

将其与您的 java 代码进行比较

for (CSVRecord record : records) {
    StringBuilder builder = new StringBuilder(); // clear builder
    ...
}

推荐阅读