Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析Node.js中的大型二进制文件_Javascript_Node.js_Stream_Synchronization_Buffer - Fatal编程技术网

Javascript 解析Node.js中的大型二进制文件

Javascript 解析Node.js中的大型二进制文件,javascript,node.js,stream,synchronization,buffer,Javascript,Node.js,Stream,Synchronization,Buffer,我想创建Node.js模块,它应该能够解析巨大的二进制文件(一些大于200GB)。每个文件分为多个块,每个块可以大于10GB。我尝试使用流动和非流动方法读取文件,但问题是,在解析块时已到达读取缓冲区的末尾,因此必须在下一个onData事件发生之前终止对该块的解析。这就是我尝试过的: var s = getStream(); s.on('data', function(a){ parseChunk(a); }); function parseChunk(a){ /*

我想创建Node.js模块,它应该能够解析巨大的二进制文件(一些大于200GB)。每个文件分为多个块,每个块可以大于10GB。我尝试使用流动和非流动方法读取文件,但问题是,在解析块时已到达读取缓冲区的末尾,因此必须在下一个
onData
事件发生之前终止对该块的解析。这就是我尝试过的:

var s = getStream();

s.on('data', function(a){
    parseChunk(a);
});

function parseChunk(a){
    /*
        There are a lot of codes and functions.
        One chunk is larger than buffer passed to this function,
        so when the end of this buffer is reached, parseChunk
        function must be terminated before parsing process is finished.
        Also, when the next buffer is passed, it is not the start of
        a new chunk because the previous chunk is not parsed to the end.
    */
}

将整个块加载到进程内存是不可能的,因为我只有8GB的RAM。如何从流中同步读取数据,或者如何在到达缓冲区末尾时暂停
parseChunk
函数并等待新数据可用?

也许我遗漏了什么,但就我所知,我不明白为什么不能使用不同语法的流来实现这一点。我会用

let chunk;
let Nbytes; // # of bytes to read into a chunk
stream.on('readable', ()=>{
  while(chunk = stream.read(Nbytes)!==null) { 
    // call whatever you like on the chunk of data of size Nbytes   
  }
})

请注意,如果您自己指定块的大小(如此处所做),则如果请求的字节数在流末尾不可用,则将返回
null
。这并不意味着不再有数据流。所以请注意,您应该期望在文件末尾返回一个大小为<
Nbytes
的“修剪”缓冲区对象

当您使用流时,您将读/写和缓冲转换为流。但是,您似乎想要精确地控制读取内容和读取时间。为什么不直接从磁盘读取您想要读取的字节数,而不使用您无法完全控制的流?@jfriend00。因为这些文件不必在我的硬盘上。流可以从服务器文件、其他进程内存的一部分或某些缓冲区获得。