我有一个任务需要做以下事情
for fi in files, do in parallel:
for job in jobs, do serially:
read fi into memory from disk
do job(fi), save output to disk
(任务的特殊性使得并行化内部循环不切实际。)
有数千个文件
和大约 400 个作业
。现在 files
是一堆 .csvs,我将输出保存到其他地方的一堆 csv。输入 csvs 大约 30MB,输出大约 10MB
我真正想要的是一个数据库,但我所知道的数据库无法处理并行 I/O。所以我只是阅读并保存了一堆 csv。我知道操作系统也不能执行并行 I/O,但它比我所知道的数据库更好地处理并行请求。
那么,执行此操作的更好方法是什么?我在 AWS 上,现在一切都在 EBS 卷中。我是否期望更好的性能将所有输入推送到 S3 存储桶、根据需要下载它们并上传输出(每个文件有几 MB)?
或者是否有某种并行 I/O 数据库架构存在于云中的某处,我可以了解然后租用?
欢迎就如何解决此问题提出建议。
最佳答案
我认为您正在做的 I/O 比您需要的多得多。你有:
for fi in files, do in parallel:
for job in jobs, do serially:
read fi into memory from disk
do job(fi), save output to disk
假设您有能力创建内存流,您可以这样做:
for fi in files, do in parallel:
read fi into memory and create memory stream ms
for job in jobs, do serially:
do job(ms), save output to disk
当然,这假设您正在复制从磁盘读入的文件,而不是就地修改它。
这应该会大大提高您的速度。您不是每次读取数千个文件 400 次,而是每个文件读取一次。
关于database - 涉及大量磁盘 I/O 的大批量处理的并行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53210796/