node.js - 当另一个进程正在写入时,我如何(安全地)读取节点流中的文件?
问题描述
我有一个在节点中运行的数据管道,类似于以下内容:
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())
});
也可以随意提出任何其他关于提高性能的想法/疑虑。
解决方案
推荐阅读
- javascript - 允许使用 jQuery Mask 在同一字段中使用 % 符号
- json - 通过 Curl POST 应用 JSON 格式
- bash - 无法直接从 bashoperator 运行 .sh 或 .py 文件
- css - 如何自动增加文本区域的宽度?
- mongodb - org.apache.kafka.connect.runtime.rest.errors.BadRequestException
- protractor - 如果片段中没有“禁用”,如何检查量角器是否禁用垫选择?
- ruby-on-rails - ActiveStorage 如何在上传到 S3 之前转换图像?
- java - JSON.stringify() 不适用于大 html 数据
- lotus-notes - rtlib-lotus notes富文本库是否支持IBM Domino Server 64bit
- r - map_dfr 函数将向量绑定到矩阵并并行运行的类比是什么?