gpt4 book ai didi

java - 将大流转换为字符串时内存不足

转载 作者:太空狗 更新时间:2023-10-29 12:49:29 26 4
gpt4 key购买 nike

我正在尝试将大流 (4mb) 转换为字符串,我最终将其转换为 JSON 数组。

当流大小很小(以 KB 为单位)时,一切正常,当它开始处理 4mb 流时,它会耗尽内存

下面是我用来将流转换为字符串的方法,我几乎尝试了所有方法,我怀疑问题出在 while 循环上。有人可以帮忙吗?

  public String convertStreamToString(InputStream is)
throws IOException {

if (is != null) {
Writer writer = new StringWriter();

char[] buffer = new char[1024];
try
{
Reader reader = new BufferedReader(
new InputStreamReader(is, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1)
{
writer.write(buffer, 0, n);
}
}
finally
{
is.close();
}
return writer.toString();
} else {
return "";
}
}

更新:好的,这就是我现在到达的地方,我在正确的轨道上吗?我想我很接近..不知道我还能关闭或刷新什么来重新获得内存..

public String convertStreamToString(InputStream is)
throws IOException {

String encoding = "UTF-8";
int maxlines = 2000;
StringWriter sWriter = new StringWriter(7168);
BufferedWriter writer = new BufferedWriter(sWriter);
BufferedReader reader = null;
if (is == null) {
return "";
} else {


try {
int count = 0;
reader = new BufferedReader(new InputStreamReader(is, encoding));
for (String line; (line = reader.readLine()) != null;) {
if (count++ % maxlines == 0) {
sWriter.close();
// not sure what else to close or flush here to regain memory
//Log.v("Max Lines Reached", "Max Lines Reached");;
}

writer.write(line);


}
Log.v("Finished Loop", "Looping over");


} finally {
is.close();
writer.close();

}
return writer.toString();
}
}

最佳答案

StringWriter 在内部写入一个 StringBufferStringBuffer 基本上是 char 数组的包装器。该数组具有一定的容量。当该容量不足时,StringBuffer 将分配一个新的更大的 char 数组并复制前一个的内容。最后,您在 StringWriter 上调用 toString(),它会再次将 char 数组的内容复制到生成的 char 数组中字符串。

如果您有任何方法可以事先知道所需的容量,您应该使用 StringWriter 的构造函数来设置初始容量。这将避免不必要地复制数组来增加缓冲区。

但这并不能避免在 toString() 中发生的最终复制。如果您正在处理可能很大的流,您可能需要重新考虑您是否真的需要将该输入流作为 String。直接使用足够大的 char 数组可以避免所有的复制,并且会大大减少内存使用量。

最终的解决方案是在所有输入都进入之前对输入进行一些处理,这样可以丢弃已处理的字符。这样,您只需在内存中保留处理步骤所需的内容。

关于java - 将大流转换为字符串时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14004933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com