0

私のAndroidアプリケーションでは、64KiBのチャンクで多数のファイルを読み取り、ソケットに書き込みます。ソケットへの書き込みは非同期であり、私はそれを制御できません。また、コールバック関数も提供しません。

大きなファイルを読み取ると、ソケットがまだバイトの解析とネットワーク経由での送信に取り組んでいるため、OOM例外が発生します。

参考までに、コードは次のようになります。

byte[] chunk = new byte[64 * 1024];
int read;
while ((read = fis.read(chunk)) != -1) {
  // Async call
  socket.write(chunk);
  chunk = new byte[64 * 1024];
}

この状況を克服するために私が従うことができるデザインパターンはありますか?

ありがとう

4

1 に答える 1

0

TCPパケットは、MTUに応じて1.5〜9KBしか保持できません。したがって、8 KBのバッファーを使用しても、おそらく違いはありません。

問題の原因は、アレイのコピーを作成していることです。

while ((read = fis.read(chunk)) != -1) {
  socket.write(chunk, 0, read); // no need to make this asynchronous.
}

OSが送信するTCPバッファは通常64KBであり、データはすでに非同期で送信されます。infinibandまたは40GigEがない限り、役に立たない可能性があります。バッファ内のデータをコピーすると、速度が低下する可能性があります。

于 2012-07-31T15:52:06.490 に答える