如何使用 Node.js 读取非常大的文件?
如何使用 Node.js 读取非常大的文件?
如何用 Node.js 处理一个 2.55 Gb 的文件,并按要求提取,统计出需要的信息?
文章完整地址为: http://docs.breword.com/92hackers-translate-articles/use-nodejs-read-large-files?language=zh-CN
我使用 Breword 翻译工具快速翻译了这篇文章,为我节省很多时间,如果你也想翻译自己的文章,欢迎使用 Breword 翻译工具:www.breword.com , 以便提高翻译效率。
1 回复
在 Node.js 中读取非常大的文件时,直接一次性读入内存可能会导致内存溢出。因此,推荐使用流(Stream)来逐块读取文件。以下是使用 fs
模块中的流来读取大文件的示例代码:
const fs = require('fs');
const readline = require('readline');
// 创建读取流
const readStream = fs.createReadStream('path/to/large/file.txt', { encoding: 'utf8', highWaterMark: 64 * 1024 }); // 64KB 缓冲区
// 创建接口来逐行读取
const rl = readline.createInterface({
input: readStream,
crlfDelay: Infinity
});
rl.on('line', (line) => {
// 在这里处理每一行数据
console.log(`Received line: ${line}`);
});
rl.on('close', () => {
console.log('File reading completed.');
});
rl.on('error', (err) => {
console.error(`Error reading file: ${err.message}`);
});
解释:
- fs.createReadStream: 创建一个读取流,通过
highWaterMark
选项设置每次读取的字节数(这里设置为 64KB)。 - readline.createInterface: 创建一个接口来逐行读取流数据。
- rl.on(‘line’, callback): 当读取到一行数据时触发,可以在回调中处理每行数据。
- rl.on(‘close’, callback): 当文件读取完成时触发。
- rl.on(‘error’, callback): 当读取文件时发生错误时触发。
这种方法可以有效地处理大文件,因为它避免了将整个文件加载到内存中。