如果我没记错的话,我记得异步 I/O(Node.js、Nginx)的“事件循环”模型不适合处理大文件。
是这样吗,如果是这样,是否有解决方法?我正在考虑在 Node 中编写一个实时文件资源管理器/文件服务器,但文件可能在 100MB 到 ~3GB 之间。我会假设事件循环会阻塞,直到文件完全服务?
最佳答案
不,它不会被阻止。 node.js 将以 block 的形式读取文件,然后将这些 block 发送到客户端。在 block 之间,它将为其他请求提供服务。
通过网络读取文件和发送数据是 I/O 绑定(bind)操作。 node.js 将首先要求操作系统读取文件的一部分,并且在操作系统执行此操作时,node.js 将服务另一个请求。当操作系统将数据返回给 node.js 时,node.js 将告诉操作系统将该数据发送到客户端。在发送数据时,node.js 将处理另一个请求。
自己试试吧:
创建一个大文件
dd if=/dev/zero of=file.dat bs=1G count=1
运行这个 node.js 应用程序
var http = require('http');
var fs = require('fs');
var i = 1;
http.createServer(function (request, response) {
console.log('starting #' + i++);
var stream = fs.createReadStream('file.dat', { bufferSize: 64 * 1024 });
stream.pipe(response);
}).listen(8000);
console.log('Server running at http://127.0.0.1:8000/');
请求 http://127.0.0.1:8000/
几次,然后看 node.js 处理它们。
如果您要提供大量大文件,您可能需要尝试不同的 bufferSize值(value)观。
关于node.js - 大文件的事件循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6926721/