优化策略一:流(Stream)方式读取
- 原理:流是一种处理流数据的抽象接口,通过逐块读取数据,而不是一次性将整个文件读入内存,从而有效控制内存使用,提高性能。对于大文件读取,流可以在读取数据的同时处理数据,无需等待整个文件加载到内存。
- 代码示例:
const fs = require('fs');
const readableStream = fs.createReadStream('largeFile.txt');
readableStream.on('data', (chunk) => {
console.log('Received a chunk of data:', chunk.length, 'bytes');
// 这里可以对chunk进行处理,比如写入另一个文件或者进行数据解析等操作
});
readableStream.on('end', () => {
console.log('All data has been read.');
});
readableStream.on('error', (err) => {
console.error('Error reading file:', err);
});
优化策略二:分块读取并处理
- 原理:手动指定每次读取的字节数,分多次读取文件内容。每次读取固定大小的块后进行相应处理,避免一次性加载大量数据到内存。
- 代码示例:
const fs = require('fs');
const fileDescriptor = fs.openSync('largeFile.txt', 'r');
const bufferSize = 1024 * 1024; // 每次读取1MB
let position = 0;
while (true) {
const buffer = Buffer.alloc(bufferSize);
const bytesRead = fs.readSync(fileDescriptor, buffer, 0, bufferSize, position);
if (bytesRead === 0) {
break;
}
// 处理buffer中的数据
console.log('Read', bytesRead, 'bytes:', buffer.toString('utf8', 0, bytesRead));
position += bytesRead;
}
fs.closeSync(fileDescriptor);