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

时间:2015-04-21 08:31:49

标签: node.js file buffer ram

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

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

  

RangeError:尝试分配大于最大大小的Buffer:0x3fffffff bytes

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

如何克服此问题并使用Node.js加载大文件?

谢谢!

2 个答案:

答案 0 :(得分:3)

来自joyent FAQ

  

节点进程的内存限制是什么?

     

目前,默认情况下,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

而且,这里的a blog post声称您可以编辑V8源代码并重建节点以删除内存限制。请自行决定。

答案 1 :(得分:0)

当尝试加载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.
});

希望有帮助。