【发布时间】:2016-12-26 20:39:08
【问题描述】:
在我的程序中,主要逻辑是用不同的方法构造字符串,然后以特定的顺序将它们保存在文件中。但是我的内存消耗非常高,所以想知道如何在内存中保存更少的字符串。所以我会尽量简化程序以方便阅读。我的小字符串生成方法确实喜欢:
那么我的主要逻辑是这样的:
BufferedWriter bw = new BufferedWriter(fw);
for(int i=1;i<1_000_000_000;i++){
bw.write(processMethod(i));
}
bw.close();
其中processMethod 是一个调用generateTag 等方法m 次的方法,使用StringBuilder 生成String,然后保存到BufferedWriter。
public static String generateTag(final String tagName, final String name, final String value) {
StringBuilder attribute = new StringBuilder();
attribute.append("<tag:");
attribute.append(tagName);
attribute.append(" name=\"");
attribute.append(name);
attribute.append("\">");
attribute.append(value);
attribute.append("</tag:");
attribute.append(tagName);
attribute.append(">");
return attribute.toString();
}
所以当我启动 processMethod 时执行 1_000_000_000 次,然后 m 次被称为 generateTag 之类的方法。我在内存中有 1_000_000_000 * m 个字符串。我怎样才能轻松删除他们的创作?我认为是这样的:
public static String generateTag(final String tagName, final String name, final String value, final BufferedWriter bf) {
....
bf.write(someBuilder.toString());
..
}
但我认为传递BufferedWriter 并不是一件好事。
你能建议我少一些 String 创建的描述吗?
【问题讨论】:
-
为什么不直接写入文件而不是将字符串保存在内存中?也就是说,为什么你认为传递
BufferedWriter不好? -
但是如何在每个方法中打开新的 BufferWrite 到文件并只传递文件的绝对路径?
-
不,您只通过
processMethod将主BufferedWriter从主传递。只有一个BufferedWriter,否则他们不会按顺序写入同一个文件,对吧? -
不是一个真正的解决方案,但您应该考虑使用启用了字符串重复数据删除的 G1GC 垃圾收集器。这可以为您节省大量内存
-
你必须传递一些东西,这样每次对 generateTag 的调用不会最终产生一个字符串。 BufferedWriter、Writer 或 StringBuilder 或 ByteBuffer - 你的电话。
标签: java string memory memory-management