面试题答案
一键面试设计思路
- 性能优化:使用 Node.js 提供的流机制,以管道(pipeline)的方式连接可读流、自定义 Transform 流和可写流,这样可以避免一次性将整个大文件读入内存,而是逐块处理数据,提高性能。
- 内存管理:通过设置
highWaterMark
参数控制内部缓冲区的大小,防止缓冲区溢出导致内存占用过高。 - 协同工作:自定义 Transform 流继承自
stream.Transform
,并重写_transform
和_flush
方法,使其能够与可读流和可写流无缝对接。_transform
方法用于处理数据块,_flush
方法用于处理流结束时的剩余数据。
代码实现
const { Transform, pipeline } = require('stream');
const fs = require('fs');
// 自定义 Transform 流
class CustomTransform extends Transform {
constructor() {
super({
highWaterMark: 64 * 1024, // 设置缓冲区大小为 64KB
});
}
_transform(chunk, encoding, callback) {
// 这里假设处理的是文本格式数据,将所有字符转换为大写
const transformedChunk = chunk.toString().toUpperCase();
this.push(transformedChunk);
callback();
}
_flush(callback) {
// 处理流结束时的操作
callback();
}
}
// 可读流,读取大文件
const readableStream = fs.createReadStream('largeFile.txt');
// 可写流,将处理后的数据写入新文件
const writableStream = fs.createWriteStream('transformedLargeFile.txt');
// 使用管道连接可读流、自定义 Transform 流和可写流
pipeline(
readableStream,
new CustomTransform(),
writableStream,
(err) => {
if (err) {
console.error('管道错误:', err);
} else {
console.log('文件处理完成');
}
}
);
上述代码实现了一个简单的自定义 Transform 流,它将读取的文件内容转换为大写后写入新文件。实际应用中,_transform
方法中的转换逻辑可根据特定数据格式需求进行修改。