React Native中使用rn-fetch-blob读写大文件内存溢出的解决方案求助
解决rn-fetch-blob处理大PDF文件时的内存溢出问题
方案1:优化分块流处理,避免一次性加载文件到内存
rn-fetch-blob的默认流处理可能会在内存中累积过多数据,你可以手动设置更小的分块大小,逐块读取并写入base64,减少单批次内存占用。示例代码如下:
const RNFetchBlob = require('rn-fetch-blob').default; const sourcePDFPath = '/你的PDF文件路径/large.pdf'; const targetBase64Path = '/输出路径/output.base64'; // 分块大小设为1MB,可根据设备内存调整 const chunkSize = 1024 * 1024; // 创建只读流,指定base64编码和分块大小 RNFetchBlob.fs.createReadStream(sourcePDFPath, 'base64', chunkSize) .then(readStream => { // 创建写入流 const writeStream = RNFetchBlob.fs.createWriteStream(targetBase64Path); // 管道传输数据 readStream.pipe(writeStream); return new Promise((resolve, reject) => { readStream.on('end', () => { console.log('Base64文件生成完成'); resolve(); }); readStream.on('error', err => { console.error('流处理出错:', err); reject(err); }); }); }) .catch(err => console.error('初始化流失败:', err));
方案2:跳过base64转换,直接操作文件流(如果业务允许)
如果你的需求是上传文件这类场景,完全没必要转成base64——base64会让文件体积膨胀33%左右,50M的PDF转完会变成66M+,大幅增加内存压力。直接用rn-fetch-blob的文件上传能力:
RNFetchBlob.fetch('POST', 'https://你的后端上传接口', { 'Content-Type': 'application/pdf', // 其他请求头根据后端要求添加 }, RNFetchBlob.wrap(sourcePDFPath)) // 直接传入文件路径包装成表单数据 .then(response => { console.log('上传成功:', response.text()); }) .catch(err => console.error('上传失败:', err));
方案3:改用原生平台的流处理逻辑
如果上面的方案还是不行,可能是rn-fetch-blob的JS层流处理存在内存泄漏或者累积问题。你可以自己写少量原生代码,利用Android的FileInputStream或iOS的NSInputStream逐块读取文件并转换为base64,再通过React Native桥接把结果返回给JS层,原生层的内存管理会更高效。
方案4:检查内存泄漏点
确保处理完流之后,所有相关的流对象、数据引用都被正确清理,避免内存无法释放。比如在end或error事件中手动解除监听,或者把相关变量置为null。
内容的提问来源于stack exchange,提问作者Rino
相关产品推荐
相关产品推荐

