Node.js NodeJS:What';读取超大文件(1GB)的最后X字节的最有效方法是什么?

Node.js NodeJS:What';读取超大文件(1GB)的最后X字节的最有效方法是什么?,node.js,Node.js,我想使用node.js高效地读取非常大文件的最后X字节。最有效的方法是什么 据我所知,实现这一点的唯一方法是创建一个读取流和循环,直到一个字节到达字节索引 例如: // lets assume I want the last 10 bytes; // I would open a stream and loop until I reach the end of the file // Once I did I would go to the last 10 bytes I kept in mem

我想使用node.js高效地读取非常大文件的最后X字节。最有效的方法是什么

据我所知,实现这一点的唯一方法是创建一个读取流和循环,直到一个字节到达字节索引

例如:

// lets assume I want the last 10 bytes;
// I would open a stream and loop until I reach the end of the file
// Once I did I would go to the last 10 bytes I kept in memory 

let f = fs.createReadStream('file.xpto'); //which is a 1gb file
let data = [];

f.on('data', function(data){
    for (d of data){
        data.push(d)
        data = data.slice(1,11); //keep only 10 elements
    }

})
f.on('end', function(){
    // check data
    console.log('Last test bytes is', data)
})
f.resume();

您基本上希望查找文件中的某个位置。有一种方法可以做到这一点。请参考以下问题和答案:

基本上,确定起始位置(使用元数据中的文件长度和感兴趣的字节数),并使用以下方法之一读取感兴趣的部分(作为流或通过缓冲区)


使用
fs.read

position
是一个参数,指定从何处开始读取文件


使用
fs.createReadStream
或者,如果要使用
createReadStream
功能,请指定
start
end
选项:

选项
可以包括
开始
结束
值,以便从文件而不是整个文件中读取一定范围的字节


下面是基于Arash Motamedi答案的示例代码。 这将使您能够在几毫秒内读取非常大文件的最后10个字节

let fs = require('fs');

const _path = 'my-very-large-file.xpto';
const stats = fs.statSync(_path);

let size = stats.size;
let sizeStart = size-10;
let sizeEnd = size;


let options = {
    start: sizeStart,
    end: sizeEnd
}
let stream = fs.createReadStream(_path, options)
stream.on('data',(data)=>{
    console.log({data});
})
stream.resume()
对于读取解决方案的版本:

从“FS/promises”导入FS;
异步函数getLastXBytesBuffer(){
const bytesToRead=1024;//要读取的x字节
常量句柄=等待FS.open(路径'r');
const{size}=await handle.stat(路径)
//从结束处计算位置x字节
const position=大小-bytesToRead;
//获取结果缓冲区
const{buffer}=await handle.read(buffer.alloc(bytesToRead),0,bytesToRead,position);
//别忘了关闭文件句柄
等待句柄。关闭()
返回缓冲区
}

这太宽泛了,没有显示您所做的任何工作。它的意思是“为我写代码”,而StackOverflow不是这样工作的。正如我所写的,不幸的是,这是一个离题的话题,它并不宽泛。这是非常具体的。在你向你的问题添加任何代码之前,是的,你的问题很广泛。也就是说,有不止一种方法可以做到这一点。很多潜在的方法。没有明确的正确答案。即使在你添加了你的代码之后,它仍然是广泛的,仍然有很多方法可以解决它。@PatrickRoberts一个接近的投票本身并不会导致一个问题被解决。但是,是的,正如最初发布的那样,它肯定是一个势均力敌的候选人(只需查看编辑历史:没有代码,只是“最有效的方式是什么”)。@Lothre1不要用答案更新你的问题。如果你想在下面给出你自己的答案,那没关系,但也要注意,如果你的答案是基于其他人的工作(如Arash),那么以后接受你自己的答案是不礼貌的。文件描述符绝对是你的选择谢谢Arash。我完全错过了readStream上的开始/结束道具。