java - 循环通过中等大小的数据集时 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 的新手。
解决方案
我认为您的代码中存在错误
records.forEach() {
output = "" // clear output ;)
...
}
将其与您的 java 代码进行比较
for (CSVRecord record : records) {
StringBuilder builder = new StringBuilder(); // clear builder
...
}
推荐阅读
- excel - 将形状(图片)复制到另一个工作簿使图片保存为 JPEG 而不是 PNG
- ruby-on-rails - 你可以创建一个没有表的数据库支持的 Rails 模型吗?
- python - pyqtgraph 滚动图:分块绘图,在当前窗口中仅显示最新的 10 秒样本
- c++ - 强制 C++ 为参数分配新地址
- ios - 带有 Flexbox 水平滚动的 Material-UI Drawer 在 iOS Safari 上不起作用
- angular - Angular 获取组件的高度和宽度
- sql - 逾期 -10 表示逾期 10 分钟。将“-10”交换为逾期 10 分钟
- c# - 无法使用 Plugin.InAppBilling 包为 Xamarin Android 获取应用内产品
- dataframe - 根据不同列python数据框中的空值过滤数据框列中的值
- python - 从 MONGO 读取 PySpark 时,ISO 日期字段会自动转换