Javascript读取大文件失败

Javascript读取大文件失败,javascript,file,io,Javascript,File,Io,JSON文件是6GB。使用以下代码读取时 var fs = require('fs'); var contents = fs.readFileSync('large_file.txt').toString(); 它有以下错误: buffer.js:182 throw err; ^ RangeError: "size" argument must not be larger than 2147483647 at Function.Buffer.allocUnsafe (

JSON文件是6GB。使用以下代码读取时

var fs = require('fs');
var contents = fs.readFileSync('large_file.txt').toString();
它有以下错误:

buffer.js:182
    throw err;
    ^

RangeError: "size" argument must not be larger than 2147483647
    at Function.Buffer.allocUnsafe (buffer.js:209:3)
    at tryCreateBuffer (fs.js:530:21)
    at Object.fs.readFileSync (fs.js:569:14)
    at Object.<anonymous> (/home/readHugeFile.js:4:19)
    at Module._compile (module.js:569:30)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Function.Module.runMain (module.js:605:10)
buffer.js:182 犯错误; ^ RangeError:“大小”参数不能大于2147483647 位于Function.Buffer.allocUnsafe(Buffer.js:209:3) 在tryCreateBuffer(fs.js:530:21) 在Object.fs.readFileSync(fs.js:569:14) 反对。(/home/readHugeFile.js:4:19) 在模块处编译(Module.js:569:30) 在Object.Module.\u extensions..js(Module.js:580:10) 在Module.load(Module.js:503:32) 在tryModuleLoad时(module.js:466:12) 在Function.Module.\u加载(Module.js:458:3) 位于Function.Module.runMain(Module.js:605:10)
有人能帮忙吗?

一个
缓冲区的最大大小约为2GB(源代码:),它是
readFileSync()
在内部用来保存文件数据的

您可能需要一个流式JSON解析器来处理您的文件:

const JSONStream = require('JSONStream');
const fs         = require('fs');

fs.createReadStream('large_file.json')
  .pipe(JSONStream.parse('*'))
  .on('data', entry => {
    console.log('entry', entry);
  });

可能重复Hi@robertklep的可能重复,我正在编写一个CLI应用程序,需要解析一个大JSON文件,并响应用户。您的代码完成了这项工作,但它是异步的。是否有推荐的同步处理流的方法?Thanks@mils本例中streams提供的主要功能是能够增量解析文件。在您的情况下,听起来您希望一次性读取/解析文件,这将需要多GB的RAM。你确定这就是你想要的吗?顺便说一句,没有任何同步流实现(除此之外,流本身就是基于事件的)。第一个过程从JSON文件中获取一组唯一的id,然后对每个id执行另一个过程,检索更深层次的数据。这就是我保持低内存使用率的方法。但我需要在第1步完全完成后执行第2步(即(id中的id)
),并将结果返回给用户。我想也许我只是一个使用javascript的n00b。有解决同步/异步问题的“经典”方法吗?谢谢again@mils可能有帮助的是观察到,当所有数据都被读取时,可读流会发出一个
end
事件。在您的情况下,可以在触发步骤1的
end
事件后开始步骤2。这样,您就可以链接流操作。对于今天的标准,缓冲区的最大2GB似乎太小了。有人知道如何增加这个吗?为什么一定要这么小?这是Javascript(v8)本身的基本限制吗?