【问题标题】:Node.js read big file with fs.readFileSyncNode.js 使用 fs.readFileSync 读取大文件
【发布时间】:2015-06-28 07:10:35
【问题描述】:

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

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

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

不幸的是,我没有发现如何增加 Buffer,它似乎是一个常数。

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

谢谢!

【问题讨论】:

  • 您可能希望分块处理文件。你想对文件做什么?您真的需要一次在 RAM 中存储全部内容吗?
  • 是的,我需要一次 RAN 中的整个文件。该文件包含一个大哈希,我需要使用整个哈希。
  • “包含大哈希”是什么意思?你的意思是它包含你要放入哈希表的数据吗?为什么不能分段处理?

标签: node.js file buffer ram


【解决方案1】:

来自joyent FAQ

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

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

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

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

还有,a blog post 声称您可以编辑 V8 源代码并重建节点以消除内存限制。请自行决定是否尝试。

【讨论】:

  • 非常感谢您的回答。这些文件包含大量词汇表的 word embeddings,其中每个单词都映射到 300 维向量。主要任务是监督分类,其中火车是一个大语料库,我需要用适当的向量替换每个单词。
  • @fog - 我不能说我完全理解你在做什么,但我认为你会想要在某种数据库中管理这 6GB 的数据并使用该数据库来根据需要查找并获取数据片段。或者,也许 node.js 不是适合这项工作的工具。
  • 我尝试在这个集合中使用 Redis,但是即使我已经使用了缓冲向量,它也很慢。
  • 我不确定这是否准确。如果我有一个 3.6GB 的文件并且我使用 fs.readFileSync('file.txt') 那么它会抛出 RangeError [ERR_FS_FILE_TOO_LARGE]: File size (3941361242) is greater than 2 GB(节点 15.14)。我可以 Buffer.alloc 大于 2GB 的缓冲区,并使用 NODE_OPTIONS='--max-old-space-size=7000' 但没有变化
【解决方案2】:

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

希望对您有所帮助。

【讨论】:

  • 谢谢你的朋友。
猜你喜欢
  • 2020-08-12
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2017-09-08
  • 2012-06-28
  • 2016-04-15
  • 2019-05-30
相关资源
最近更新 更多