我需要将一个大的 csv 文件内容保存在我的表格的一列中。我尝试过使用缓冲区,但它返回
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
,这是一种使用流保存它的方法,即仅将部分 csv 存储在内存中,而不是整个 csv 数据?
将整个 CSV 存储在内存中:
let content = [];
let bufferContent = null;
await (new Promise(resolve => {
notificationRequest.usersStream
.on(‘data’, function(buffer) {
content.push(buffer);
})
.on(‘end’, function() {
bufferContent = Buffer.concat(content);
resolve();
});
}));
尝试将缓冲区保存在数据库中:
this.dbRepository.save(bufferContent);
给我错误:
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
类型ORM实体
@Column({ type: ‘bytea’, nullable: true})
csvBuffer?: Buffer;
PS:如果文件很小,上面的代码可以完美运行。
使用
stream
中的 Writable 它将创建一个可写流来处理将块保存到数据库。
const { Writable } = require('stream');
const writableStream = new Writable({
write: async (chunk, encoding, callback) => {
try {
await this.dbRepository.save({ csvBuffer: chunk });
callback();
} catch (error) {
callback(error);
}
},
});
notificationRequest.usersStream
.pipe(writableStream)
.on('finish', () => {
console.log('Success.');
})
.on('error', (error) => {
console.error('Failed:', error);
});