使用TypeORM将数据流保存在PostgreSQL的列中

问题描述 投票:0回答:1

我需要将一个大的 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:如果文件很小,上面的代码可以完美运行。

javascript postgresql stream typeorm
1个回答
1
投票

使用

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);
  });
© www.soinside.com 2019 - 2024. All rights reserved.