uni-app中如下代码,下载二进制文件并读取arraybuffer转成字节数组,转成微信小程序代码会内存溢出,但原生小程序开发无此问题
uni-app中如下代码,下载二进制文件并读取arraybuffer转成字节数组,转成微信小程序代码会内存溢出,但原生小程序开发无此问题
let that = this
uni.getFileSystemManager().readFile({
filePath: tempFilePath,
success(readRes) {
that.binFileArrays = Array.from(new Uint8Array(readRes.data));
console.log(‘转换完成’);
that.sendGetProtocolVersionData() // 获取OTA协议版本
},
});
更多关于uni-app中如下代码,下载二进制文件并读取arraybuffer转成字节数组,转成微信小程序代码会内存溢出,但原生小程序开发无此问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
我试了一下,未能复现所说问题,会不会文件大小太大了导致的,或者是其他的代码逻辑导致的
更多关于uni-app中如下代码,下载二进制文件并读取arraybuffer转成字节数组,转成微信小程序代码会内存溢出,但原生小程序开发无此问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
export default { data() { return { binFileArrays: [], }; }, methods: { // 1.下载升级文件 upotaFile() { let that = this; uni.downloadFile({ url: ‘https://eartech-dev.oss-cn-shenzhen.aliyuncs.com/firmware/2024/03/07/1709795012646/Sara_1.14.23.01_OTA.bin’, //ota下载文件路径 success(aa) { if (aa.statusCode === 200) { // 下载成功 let tempFilePath = aa.tempFilePath; uni.getFileSystemManager().readFile({ filePath: tempFilePath, success(bb) { that.binFileArrays = Array.from(new Uint8Array(bb.data)); console.log(‘转换完成’); }, }); } } }); },
回复 JXWang: 我使用hubilderX 3.99 微信开发者工具 Stable 1.06.2401020,一摸一样的代码,没复现内存溢出的问题
回复 JXWang: 我的HbuilderX是3.99 微信开发者工具是 1.06.2402021 我这边的现象是等待转换完成要很长时间,小程序会自动闪退,报内存不足。
回复 JXWang: 回复 JXWang: 还有我是Mac客户端
回复 s***@163.com: 是在微信开发者工具中复现的吧?可以试试将内存限制调大一点试试
回复 JXWang: 不是的 是真机调试不行 微信开发者工具的模拟器倒还正常
在 uni-app
中,将二进制文件下载并读取为 ArrayBuffer
,然后转换为字节数组的过程中,如果遇到内存溢出的问题,可能是因为 uni-app
在处理大文件时存在一些性能瓶颈,或者与微信小程序的运行环境不同导致的。
以下是一些可能的原因和解决方法:
1. 文件过大
如果下载的文件非常大,处理时可能会导致内存溢出。原生小程序可能对此有更好的优化,而 uni-app
可能在处理大文件时效率较低。
解决方法:
- 分块处理:可以将文件分成多个小块进行下载和处理,避免一次性加载整个文件。
- 使用流式处理:如果微信小程序支持流式处理,可以考虑使用流式读取文件,而不是一次性将整个文件加载到内存中。
2. uni-app
和微信小程序的差异
uni-app
是通过将代码编译为微信小程序代码来运行的,因此在某些情况下,编译后的代码可能不如原生小程序代码高效。
解决方法:
-
直接使用微信小程序的 API:在
uni-app
中,可以直接调用微信小程序的 API,而不是使用uni-app
的封装 API。例如,使用wx.downloadFile
和wx.readFile
来代替uni.downloadFile
和uni.readFile
。wx.downloadFile({ url: 'https://example.com/file.bin', success(res) { wx.readFile({ filePath: res.tempFilePath, encoding: 'binary', success(data) { const arrayBuffer = data.data; const byteArray = new Uint8Array(arrayBuffer); console.log(byteArray); }, fail(err) { console.error('读取文件失败', err); } }); }, fail(err) { console.error('下载文件失败', err); } });
3. uni-app
的内存管理
uni-app
可能在内存管理上与原生小程序存在差异,尤其是在处理二进制数据时。
解决方法:
-
手动释放内存:在处理完
ArrayBuffer
后,手动将其设置为null
,以帮助垃圾回收器释放内存。let arrayBuffer = null; let byteArray = null; // 处理完数据后 arrayBuffer = null; byteArray = null;