【发布时间】:2019-06-28 20:27:17
【问题描述】:
我正在尝试用Base64写一个String,这个String代表一个PDF文件,
for (int i = 0; i < 500; i++) {
cedula++;
escribirArchivo.escribirInfoEnElArchivo(data1.append(pdf).append(",").append(cedula).toString());
escribirArchivo.escribirInfoEnElArchivo(data2.append(pdf2).append(",").append(cedula).toString());
escribirArchivo.escribirInfoEnElArchivo(data3.append(pdf3).append(",").append(cedula).toString());
}
这是我写文件的方法
public void escribirInfoEnElArchivo( String infoToWrite) {
try {
fileWriter.write(infoToWrite + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
这在某些时候消耗了大约 2-3GB 的内存,我用完了内存并抛出堆内存错误,我怎样才能以更好的方式执行此操作?
【问题讨论】:
-
不要尝试先在内存中构建整个字符串。只需将其分段写入文件即可。
-
这里需要minimal reproducible example...
data1、data2、data3、pdf、pdf2、pdf3是什么?这些真的需要在内存中吗?正如发布的那样,它们每增加 500 倍 -
data 1, data 2, data3 是StringBuilder,pdf, pdf, pdf3 是Base64 String,代表三个不同大小的pdf
-
你是不是故意不清理你的StringBuilders?我想在附加
pdf + "," + cedula500 次后,data1会很长并且会占用大量内存。 -
如何清除?