Javascript读取大文件失败
JSON文件是6GB。使用以下代码读取时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 (
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)本身的基本限制吗?