MST

星途 面试题库

面试题:Node.js fs模块异步写入文件的性能优化

假设你需要将一个非常大的文本内容写入文件,使用fs模块的异步写入方法,如何优化写入性能以避免内存溢出问题?请说明思路并给出关键代码片段。
30.2万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 流的使用:使用可读流(fs.createReadStream)从大文本读取数据,使用可写流(fs.createWriteStream)写入文件。这样数据会以小块的形式流动,而不是一次性全部读入内存。
  2. 背压处理:在数据流动过程中,处理背压问题。可写流可能会因为写入速度慢于可读流读取速度而导致数据堆积,通过监听可写流的drain事件来处理这种情况。

关键代码片段

const fs = require('fs');

const readableStream = fs.createReadStream('largeTextFile.txt');
const writableStream = fs.createWriteStream('outputFile.txt');

// 监听可读流的data事件,将数据写入可写流
readableStream.on('data', (chunk) => {
    const writeResult = writableStream.write(chunk);
    if (!writeResult) {
        // 如果write返回false,说明可写流缓冲区已满,暂停可读流
        readableStream.pause();
        writableStream.once('drain', () => {
            // 当可写流缓冲区有空间时,恢复可读流
            readableStream.resume();
        });
    }
});

// 处理可读流结束事件
readableStream.on('end', () => {
    writableStream.end();
});

// 处理错误
readableStream.on('error', (err) => {
    console.error('Read error:', err);
});
writableStream.on('error', (err) => {
    console.error('Write error:', err);
});