Amazon S3中大型gzip压缩CSV文件注入表头的最优方案
S3大体积gzip压缩CSV批量注入表头优化方案
原方案耗时根因
你当前使用的s3 cp + sed方案慢,核心是存在两个冗余开销:
- 全量文件下载到本地磁盘、处理后再读磁盘上传,多了不必要的磁盘IO消耗
- 一般默认串行处理单文件,没有利用带宽/CPU资源并行处理
最优落地方案:流式并行处理
推荐在S3同区域的临时EC2上执行,走内网带宽无公网限速,全程不落本地磁盘,并行处理所有文件,耗时可以压缩到原方案的1/10甚至更低。
单文件流式处理命令(无临时文件)
全程走内存管道,直接从S3读流、处理、写回S3:
aws s3 cp s3://<源桶名称>/<源文件路径>.csv.gz - | \ gzip -d | \ sed '1i <你的表头内容,比如col1,col2,col3>' | \ gzip | \ aws s3 cp - s3://<目标桶名称>/<处理后文件路径>.csv.gz
15个文件批量并行处理
- 先把所有需要处理的文件名存入
file_list.txt,每行一个文件名 - 用
GNU Parallel启动15个并行进程同时处理:
parallel -j 15 'aws s3 cp s3://<源桶名称>/{} - | gzip -d | sed "1i <你的表头内容>" | gzip | aws s3 cp - s3://<目标桶名称>/{}' :::: file_list.txt
注:同区域EC2处理5GB文件单文件耗时一般不超过2分钟,15个并行处理总耗时不到3分钟,成本仅几毛钱。
其他可选方案
- 无服务器方案:用S3 Batch Operations触发Lambda处理每个文件,Lambda内用同样的流式逻辑处理,不用自己维护服务器,适合不想操作EC2的场景,注意Lambda内存配置不低于1GB,超时时间设置为15分钟上限即可。
- 数据处理场景复用:如果这批文件后续需要入数仓/做清洗,直接用AWS Glue分布式ETL作业处理,指定Schema后直接写回S3,不用自己写处理逻辑。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

