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 数据包只能容纳 1.5 - 9 KB,具体取决于 MTU。因此,如果您使用 8 KB 缓冲区,它可能不会有任何区别。

您的问题的原因是您正在创建数组的副本..

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

操作系统发送 TCP 缓冲区通常为 64 KB,并且已经异步发送数据。除非您有 infiniband 或 40 GigE,否则它不太可能有帮助。复制缓冲区中的数据可能会使其变慢。

于 2012-07-31T15:52:06.490 回答