【发布时间】:2021-08-20 05:45:29
【问题描述】:
我每小时创建数百万个文件。每个文件有一行数据。这些文件需要合并到一个文件中。
我尝试过以下方式:-
- 使用 aws s3 cp 下载一小时的文件。
- 使用 bash 命令合并文件。 或
- 使用 python 脚本合并文件。
这项每小时作业正在 Airflow on Kubernetes (EKS) 中运行。这需要一个多小时才能完成,并且正在创建积压工作。另一个问题是它经常导致 EC2 节点由于高 CPU 和内存使用率而停止响应。运行此作业的最有效方法是什么?
python脚本供参考:-
from os import listdir
import sys
# from tqdm import tqdm
files = listdir('./temp/')
dest = sys.argv[1]
data = []
tot_len = len(files)
percent = tot_len//100
for i, file in enumerate(files):
if(i % percent == 0):
print(f'{i/percent}% complete.')
with open('./temp/'+file, 'r') as f:
d = f.read()
data.append(d)
result = '\n'.join(data)
with open(dest, 'w') as f:
f.write(result)
【问题讨论】:
-
有一种方法可以检查这个 - stackoverflow.com/questions/17749058/… 还有另一种有效且简单的方法,检查这个 - stackoverflow.com/questions/4827453/…
-
显示代码?不清楚“合并”对您意味着什么,如果它只是意味着以任意顺序将文件内容粘贴在一起,那么很难想象 如何 编写需要大量内存使用的代码。
-
@user84634 我开始使用 cat,它在正则表达式扩展太多文件时出错。所以我用 find 命令替换了它。即使在此之后,该命令也需要很多时间。我尝试了读取然后加入的简单 python 代码,但即使这样也需要超过 2 小时,这对于每小时任务来说并不好,有时甚至会导致 EKS 集群中的节点崩溃。
-
@TimPeters 是的,我的意思是按任意顺序将文件粘贴在一起。当我运行“aws s3 cp”时,文件夹的内容被下载到 EKS 集群中运行的 pod 中,当我检查内存使用情况时,它开始超过 1GB 进入作业。 (原始文件的总大小约为 1GB)。我还添加了python代码。
-
还有另一种方法,您可以编写一个脚本,将文件分成 50-100 个子目录。然后一次在 30-40 个目录中异步运行 python/bash 代码。与以前的方法相比,这将更快地完成工作。
标签: python amazon-s3 cron airflow amazon-eks