gpt4 book ai didi

java - 我应该如何在不溢出堆的情况下处理大型(70MB 未压缩)字节流的解压?

转载 作者:行者123 更新时间:2023-12-03 23:01:13 25 4
gpt4 key购买 nike

我正致力于为我们的一些系统之间的交互实现 GZIP 压缩。这些系统是用 Java 和 C# 编写的,因此双方都使用了 GZIP 流,因为它们具有标准库支持。

在 C# 方面,一切正常,包括我们最大的测试文件(未压缩的 70MB),但是我们遇到了 Java 堆空间不足的问题。我们已尝试将堆大小增加到 IDE 的容量,但问题仍未解决。

我已经采取了一些措施来尝试优化 Java 代码,但似乎无法阻止数据堆积在堆中。有没有好的方法来处理这个问题?以下是我当前(处理较小的流)解决方案的一个子集。

编辑:根据@MarkoTopolnik 的建议修改以下代码。通过更改,崩溃前读取了 1700 万个字符。

public static String decompress(byte[] compressed, int size)
{
GZIPInputStream decompresser;
BufferedReader reader;
char buf[] = new char[(size < 2048) ? size : 2048];
Writer ret = new StringWriter( buf.length );

decompresser = new GZIPInputStream( new ByteArrayInputStream( compressed ), buf.length );
reader = new BufferedReader( new InputStreamReader( decompresser, "UTF-8" ) );

int charsRead;
while( (charsRead = reader.read( buf, 0, buf.length )) != -1 )
{
ret.write( buf, 0, charsRead );
}
decompresser.close();
reader.close();

return ret.toString();
}

代码在 ArrayList 中超过 760 万个字符后终止,堆栈跟踪表明 ArrayList.add() 调用是原因(触发内部数组展开后失败)

使用上面编辑过的代码,调用 AbstractStringBuilder.expandCapacity() 会终止程序。

是否有一种内存消耗较少的方法来实现动态数组,或者我可以使用一些完全不同的方法从解压流中获取字符串?任何建议将不胜感激!

最佳答案

我会将其分块而不是将整个内容读入内存:一次读入 1024 字节缓冲区并立即将其写出,更像是 Unix 管道而不是两步读/写过程。

关于java - 我应该如何在不溢出堆的情况下处理大型(70MB 未压缩)字节流的解压?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16843936/

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