Node.js流处理超大文件时抛出RangeError的原因排查
问题原因及解决方案
错误原因
你遇到的RangeError: Invalid string length是因为V8引擎(Node.js默认JS引擎)对单个字符串的长度有上限,大概是2^29-1个字符(约5.3亿)。你的10亿位PI文件远超过这个限制,把所有chunk拼进同一个字符串pi里时,字符串长度突破了引擎的最大值,所以抛出错误。而100万位远低于上限,所以可以正常运行。
正确解法
不需要把整个文件内容加载到内存里,只需要在每个chunk到来时累加它的长度即可,这样内存占用几乎可以忽略:
import fs from "fs"; let totalLength = 0; const readStream = fs.createReadStream('pi-billion.txt', 'utf-8'); readStream.on('data', (chunk) => { totalLength += chunk.length; }); readStream.on('error', (error) => console.log(`error: ${error.message}`)); readStream.on('end', () => console.log(totalLength));
这个思路的核心是只统计长度,不存储整个文件内容,完全避开了字符串长度限制的问题。
内容的提问来源于stack exchange,提问作者Kelson Batista
相关产品推荐
相关产品推荐

