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

12 回复

我试了一下,未能复现所说问题,会不会文件大小太大了导致的,或者是其他的代码逻辑导致的

更多关于uni-app中如下代码,下载二进制文件并读取arraybuffer转成字节数组,转成微信小程序代码会内存溢出,但原生小程序开发无此问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


<template> <view> <view class="wx-bg-red otaBt" [@tap](/user/tap)="upotaFile">立即升级</view> </view> </template>

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(‘转换完成’); }, }); } } }); },

}; </script>

<style> .otaBt { width: 100%; padding: 25rpx 0; font-size: calc(34rpx + 0.5 * (1rem - 16px)); text-align: center; color: white; border-radius: 70rpx; } </style>

可以试下完整代码 文件不到4M

回复 s***@163.com: 请问使用的hbuilderX版本和微信开发者工具版本是什么

回复 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.downloadFilewx.readFile 来代替 uni.downloadFileuni.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;
回到顶部