Node.js 使用 fs.readFileSync 读取大文件

com*_*com 4 ram buffer file node.js

我尝试在具有 96GB RAM 的服务器上使用fs.readFileSync将大文件(~6Gb)加载到内存中。

问题是它失败并显示以下错误消息

RangeError:尝试分配大于最大大小的缓冲区:0x3fffffff 字节

不幸的是,我没有找到如何增加缓冲区,它似乎是一个常数。

我如何克服这个问题并使用 Node.js 加载一个大文件?

谢谢!

Nga*_*Duy 6

尝试加载 6.4G 视频文件以创建文件哈希时,我也遇到了同样的问题。我通过 fs.readFile() 读取整个文件并导致错误 RangeError [ERR_FS_FILE_TOO_LARGE]。然后我使用流来做到这一点:

let hash = crypto.createHash('md5'),
    stream = fs.createReadStream(file_path);

stream.on('data', _buff => { hash.update(_buff, 'utf8'); });
stream.on('end', () => { 
    const hashCheckSum = hash.digest('hex');
    // Save the hashCheckSum into database.
});
Run Code Online (Sandbox Code Playgroud)

希望它有所帮助。


jfr*_*d00 5

来自joyent常见问题解答

节点进程的内存限制是多少?

目前,默认情况下,v8 在 32 位系统上的内存限制为 512mb,在 64 位系统上为 1gb。可以通过将 --max_old_space_size 设置为最大 ~1024 (~1 GiB)(32 位)和 ~1741(~1.7GiB)(64 位)来提高限制,但建议您拆分单个进程如果您遇到内存限制,则进入几个工作人员。

如果您显示有关文件内容以及您正在使用它做什么的更多详细信息,我们可能会提供一些有关如何分块使用它的想法。如果它是纯数据,那么您可能希望使用数据库并让数据库根据需要处理从磁盘获取内容并管理内存。

这是最近对该问题的讨论:https : //code.google.com/p/v8/issues/detail?id=847

而且,这里有一篇博客文章声称您可以编辑 V8 源代码并重建节点以消除内存限制。请自行决定尝试此操作。