首页 > 解决方案 > 当另一个进程正在写入时,我如何(安全地)读取节点流中的文件?

问题描述

我有一个在节点中运行的数据管道,类似于以下内容:

s3.getObject({Bucket: ..., Key: ...})
  .createReadStream()
  .pipe(gunzip())
  .pipe(csv())
  .pipe(transformToJSON())
  .pipe(sinkToDynamoDB());

老实说,它真的很慢,如果文件足够大(很多文件都是),它最终会在 S3 端(或任何网络文件读取)超时,因为它读取源文件的速度非常慢。

我想将 S3 的读取与对 DynamoDB 的写入分离,通过将文件缓冲到磁盘,这本质上会变慢。我还可以利用比 gunzip 快 3 倍的 pigz。如何确保在网络速度变慢的情况下,文件读取器在 s3 写入器完成下载整个文件之前到达缓冲文件的末尾,它可以在到达文件末尾的任何地方继续读取。

这是我正在考虑的蓝图:

process.exec('aws s3 cp s3://mybucket/key.csv.gz - | unpigz -c > myBufferredFile.csv')
// Maybe I could add a 1-second wait here to give the file download a head start
// process.execSync('sleep 1')
const filestream = fs.createReadStream('myBufferedFile.csv')
fileStream.on('open', () => {
    filestream.pipe(csv())
      .pipe(transformToJSON())
      .pipe(sinkToDynamoDB())
});

也可以随意提出任何其他关于提高性能的想法/疑虑。

标签: node.jsamazon-s3pipepipelinenode-streams

解决方案


推荐阅读