【发布时间】:2019-10-06 04:34:03
【问题描述】:
如何在使用 NodeJS 从不同位置读取完全相同文件的多个输入流时写入单个文件。
因为它还不清楚可能吗?
我想为下载使用更多性能假设我们有 2 个位置用于同一个文件,每个位置只能执行 10mb 的下行,所以我想从第一个位置和第二个位置并行下载一部分。用 20mb 获得它。
所以两个流都需要以某种方式加入,并且两个流都需要知道它们正在下载的范围。
我有两个例子
var http = require('http')
var fs = require('fs')
// will write to disk __dirname/file1.zip
function writeFile(fileStream){
//...
}
// This example assums downloading from 2 http locations
http.request('http://location1/file1.zip').pipe(writeFile)
http.request('http://location2/file1.zip').pipe(writeFile)
var fs = require('fs')
// will write to disk __dirname/file1.zip
function writeFile(fileStream){
//...
}
// this example is reading the same file from 2 diffrent disks
fs.readfFile('/mount/volume1/file1.zip').pipe(writeFile)
fs.readfFile('/mount/volume2/file1.zip').pipe(writeFile)
我认为它会如何工作
ReadStream 需要在重新读取每个文件的下一个块之前检查是否已经写入了定义的内容范围,也许它们应该从文件中的随机位置开始读取。
如果总文件内容长度为 X,我们会将其分成更小的块并创建一个映射,其中每个条目都有固定的内容长度,以便我们知道我们得到了哪些部分以及我们总共下载了哪些部分。
我自己试着回答这个问题
我们可以尝试简单的乐观加注
let SIZE = 64; // 64 byte intervals
let buffers = []
let bytesRead = 0
function readParallel(filepath,callback){
fs.open(filepath, 'r', function(err, fd) {
fs.fstat(fd, function(err, stats) {
let bufferSize = stats.size;
while (bytesRead < bufferSize) {
let size = Math.min(SIZE, bufferSize - bytesRead);
let buffer = new Buffer(size),
let position = bytesRead
let length = size
let offset = bytesRead
let read = fs.readSync(fd, buffer, offset, length, position);
buffers.push(buffer);
bytesRead += read;
}
});
});
}
// At the End: buffers.concat() ==== "File Content"
fs.createReadStream() 有一个选项,你可以通过它来指定开始
let f = fs.createReadStream("myfile.txt", {start: 1000});
您也可以使用fs.open() 打开一个普通的文件描述符,然后使用fs.read() 的位置参数从您希望流定位的位置之前一个字节的fs.read() 打开一个字节,然后您可以传递该文件描述符到fs.createReadStream() 作为一个选项,并且流将从该文件描述符和位置开始(尽管显然fs.createReadStream() 的start 选项更简单一些)。
【问题讨论】: