gpt4 book ai didi

android - 文件下载 - 内存不足(OOM)

转载 作者:行者123 更新时间:2023-11-30 03:07:13 25 4
gpt4 key购买 nike

我在某些设备上下载文件时遇到一些问题,出现 OOM 错误。这是我用来下载大文件的代码:

/**
* The size of the chunks that an file is split when writing to server.<br />
* 1024 * 1024 -> 1mb
*/
private static final int CHUNK_SIZE = 1024 * 1024;

File output = new File(sdCardPath, fileName);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(output);
} catch (FileNotFoundException e) {
e.printStackTrace();
}

int offset = 0;

// compute the number of chunks of 1 mb for downloading the file
// by parts
int parts = tmpFileSize / CHUNK_SIZE;
ByteString readingfile = null;
long progressUpdate = 0;

for (int partsCounter = 0; partsCounter < parts + 1; partsCounter++) {
try {
readingfile = serviceApi
.readFile(
session,
filehandle, offset, CHUNK_SIZE);

byte[] bytesRead = readingfile.toByteArray();
int numberOfBytesReaded = bytesRead.length;
offset = offset + numberOfBytesReaded;
progress.publish(""
+ (int) ((progressUpdate * 100) / tmpFileSize));
progressUpdate += numberOfBytesReaded;
fileOutputStream.write(bytesRead, 0,
numberOfBytesReaded);

} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

try {
if (null != fileOutputStream) {
fileOutputStream.flush();
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}

如果我在这里做错了什么,有人可以告诉我吗?谢谢。


基于@Ari 回答的解决方案我已经更新了代码。现在它被优化为仅使用 1mb(我不知道这是否是将进程分成 block 的最佳方式,但现在似乎有所改进并且不会出现 OOM)。我会尝试通过检测我可以使用多少堆内存来进一步优化它,但我不确定我能做到这一点。直到这似乎是最好的选择。再次感谢@Ari。

最佳答案

您有许多不需要的缓冲区。

  1. byte[] br = readingfile.toByteArray(); 您正在使用它来获取 numberOfBytesReaded
  2. 然后您将再次获取数组:inputStream = ... readingfile.toByteArray());并将其复制到第三个缓冲区
  3. byte data[] = new byte[bufferSize];

尝试对所有这些操作只使用一个。

一般建议是在不再需要对象(和数组)指针时将它们设置为 NULL

我会使用这样的代码:

for (int partsCounter = 0; partsCounter < parts + 1; partsCounter++) {
readingfile = serviceApi.readFile(session, filehandle, offset,
(int) bufferSize);
byte[] br = readingfile.toByteArray();
int numberOfBytesReaded = br.length;
offset = offset + numberOfBytesReaded;

try {
progress.publish(""
+ (int) ((progressUpdate * 100) / tmpFileSize));
progressUpdate += numberOfBytesReaded;
fileOutputStream.write(br, 0, numberOfBytesReaded);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

关于android - 文件下载 - 内存不足(OOM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21599583/

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