如果我从SOAP响应接收的内存中已经有一个大字节数组。
我必须将此字节数组写入OutputStream。
只需使用write:
即可byte [] largeByteArray=...;
outputstream.write(largeByteArray);
...
outputstream.flush();
...
或更好在小块中拆分 bytearray并将其写入输出流?
答案 0 :(得分:5)
如果你已经获得大型数组,那么只需将其写出来 - 如果输出流实现选择将其分块,它就可以做出决定。我没有看到你为此做的好处 - 如果它能够处理大块的话,这可能会使更少有效。
答案 1 :(得分:4)
如果你想提高效率,我会在你得到数据的同时编写数据,而不是构建一个大字节[](等到结束开始写)。如果这是一个选项,它可以更快,更有效。但是,如果这不是一个选项,请使用一个大写。
答案 2 :(得分:2)
您使用什么类型的输出流? 有些输出流可以以块的形式写入数组。 一般来说,我相信如果您为每个字节发出I / O操作(写入),性能可能会很差,因为I / O操作很昂贵。
答案 3 :(得分:1)
我能想到没有可能的理由,如果没有真正离奇和荒谬的话会更好。通常,如果您可以在不需要额外努力的情况下在更大的块之间传递数据,那么您应该这样做。通常,以这种方式做事情甚至值得付出额外的努力,那么为什么你要付出额外的努力来做更多的工作呢?
答案 4 :(得分:-2)
如果largeByteArray
非常大,写作业成本太长,而且内存是一个相当大的条件:
将数组拆分为部分,写完一部分后,设置part = null,此版本的部件参考,将尽快使JVM / GC成为部分。
通过拆分和释放,您可以在OOM-ERROR发生之前同时执行更多write(largeByteArray)作业。
注意: 在拆分阶段,JVM需要双重数组化内存来执行此操作,但在拆分后,原始数组最终将获得GC,您将恢复使用与以前相同的内存量。
示例:服务器有1GB内存。它可以运行最多100个线程,每个持有并向客户端发送10MB数据。
如果使用大10MB阵列,内存使用总是1GB,即使所有线程都没有备用,也没有发送1MB数据。
我的解决方案分为10MB到10 * 1MB。发送一些MB部分后,发送的部分可能会得到JVM / GC。每个线程在整个生命周期内的平均内存成本都会降低。所以服务器可以运行更多任务