Javascript 在nodejs中处理大型文件和节点以及内存限制

Javascript 在nodejs中处理大型文件和节点以及内存限制,javascript,node.js,dom-events,large-files,Javascript,Node.js,Dom Events,Large Files,我必须打开一个非常大的文件~15GB,并尝试使用fs.readFileSync读取整个文件,然后根据密钥将整个文件放入hashmap以消除文件重复。但很快我就遇到了一个问题,由于v8限制,我无法将整个文件读入内存 我尝试使用-max old space size传递较大的内存大小,但它仍然不起作用 为什么呢 这是nodejs中的限制还是我遗漏了什么 我的机器中有64GB内存 例如,有一个大文件data.txt,格式如下,我必须根据uuid进行重复数据消除: new record field_se

我必须打开一个非常大的文件~15GB,并尝试使用
fs.readFileSync
读取整个文件,然后根据密钥将整个文件放入hashmap以消除文件重复。但很快我就遇到了一个问题,由于v8限制,我无法将整个文件读入内存

我尝试使用
-max old space size
传递较大的内存大小,但它仍然不起作用

为什么呢

这是nodejs中的限制还是我遗漏了什么

我的机器中有64GB内存

例如,有一个大文件data.txt,格式如下,我必须根据uuid进行重复数据消除:

new record
field_separator
1fd265da-e5a6-11ea-adc1-0242ac120002 <----uuid
field_separator
Bob
field_separator
32
field_separator
Software Engineer
field_separator
Workday
point_separator
new record
field_separator
5396553e-e5a6-11ea-adc1-0242ac120002
field_separator
Tom
field_separator
27
this is a field3
QA Engineer
field_separator
Synopsis
point_separator
........
新记录
磁场分离器
1fd265da-e5a6-11ea-adc1-0242ac120002说明32位系统的最大缓冲区大小为~1GB,64位系统的最大缓冲区大小为~2GB

您还可以搜索Stack Overflow,查找有关Node.js中使用的JavaScript引擎V8的最大大小或V8使用的最大大小的问题

我预计将15GB文件读入内存并基于其全部内容创建对象的可能性约为零,并且您需要寻找
fs.readFileSync
的替代方案(例如读取流、使用数据库或使用不同的服务器)

可能需要验证堆统计信息中的“可用”内存值是否反映了使用CLI选项设置的大小
--max old space size
。可以通过运行

const v8 = require("v8");
console.log( v8.getHeapSpaceStatistics());
console.log( v8.getHeapStatistics());
在节点中

询问关于增加字符串大小的固定限制。从那时起,它可能已经增加了,但是说它不太可能超过32位寻址(4GB)的限制


如果不更改缓冲区和字符串大小限制,则无法将16GB文件的内容作为字符串或缓冲区读取和返回。

如果您试图执行以下操作:

将记录附加到UUID唯一的较小文件(较小文件中尚未存在)

然后,我将建议以下过程

  • 设计一个从文件中读取下一条记录并将数据解析为Javascript对象的方案
  • 使用该方案读取较小文件中的所有记录(一次一条记录),将该文件中的每个UUID添加到
    Set
    对象中(用于跟踪唯一性)
  • 处理完这个小文件后,现在有了一个
    Set
    对象,其中包含所有已知的uuid
  • 现在,使用相同的读取方案从较大的文件中读取下一条记录(一次读取一条记录)。如果记录不在UUID集中,则将其添加到该集中,并将该记录附加到较小的文件中。如果记录在UUID集中,则跳过它
  • 继续从大文件中读取记录,直到检查完所有记录

  • 您的系统中有多少内存?你想要达到什么样的确切效果?只有当我们能够看到您试图实现的实际数据和实际操作时,我们才能真正帮助您使用其他方法。实现这一点的最佳方法不太可能是立即将整个文件读入内存。@jfriend00我的系统中有64GB的RAM。因此,如果有一种方法可以将完整的文件放入内存,那么节点的内存不应该是问题所在。这是什么类型的文件?如果不能流式传输,可以使用内存映射文件吗?它是一个文本文件什么类型的文本文件?那么
    --max old space size
    标志的作用是什么。我想我可以用这个标志传递一个大内存。@探索一个感兴趣的问题-请查看更新的回复。@按照他们说的进行探索,信任但验证。编写测试代码以找到可以使用的最大缓冲区/类型化数组大小是很好的-web上的文档可能并不总是适用的或最新的。即使使文件处理异步可能是一个更好的选择,您也应该能够通过打开文件并将读取的文件放置在缓冲区中一次同步读取文件。至少在理论上,我已经很久没有使用文件描述符了。。