我有一个包含约 50k 个文件的目录。每个文件有 ~700000 行。我编写了一个 awk 程序来读取每一行并仅在出现错误时打印。一切都运行得很好,但是花费的时间很长 - 大约 4 天!!!!有没有办法减少这个时间?我们可以使用多个内核(进程)吗?以前有人试过吗?
问问题
3846 次
1 回答
2
awk
并且gawk
不会自己为您解决此问题。没有神奇的“使其并行”开关。您将需要在某种程度上重写:
- 按文件分片 - 解决此问题的最简单方法是并行运行多个 awks,每个文件一个。您将需要某种调度机制。 使用最大进程数并行化 Bash 脚本显示了如何在 shell 中自己编写它。这将需要更多阅读,但如果您想要更多功能,请查看适合您的问题的gearman或celery
- 更好的硬件- 听起来您可能需要更快的 CPU 才能使其运行得更快,但这也可能是 I/O 问题。拥有来自 munin 或其他一些监控系统的 CPU 和 I/O 图表将有助于隔离在这种情况下哪个是瓶颈。您是否尝试过在基于 SSD 的系统上运行此作业?如今,这通常很容易获胜。
- 缓存- 可能有一些重复的行或文件。如果有足够的重复项,以某种方式缓存处理会很有帮助。如果您计算
md5sum
文件的 CRC/ 并将其存储在数据库中,则可以计算新文件的 md5sum 并跳过处理(如果您已经这样做了)。 - 完全重写- 缩放这个
awk
在某些时候会变得荒谬。使用一些map-reduce框架可能是一个好主意。
于 2015-08-21T15:53:07.017 回答