【问题标题】:Using multiple threads/cores for awk performance improvement使用多个线程/内核来提高 awk 性能
【发布时间】:2013-04-09 04:50:36
【问题描述】:

我有一个包含约 50k 个文件的目录。每个文件有 ~700000 行。我编写了一个 awk 程序来读取每一行并仅在出现错误时打印。一切都运行得很好,但是花费的时间很长 - 大约 4 天!!!!有没有办法减少这个时间?我们可以使用多个内核(进程)吗?以前有人试过吗?

【问题讨论】:

  • 只有在出现错误时才打印?这是否只是在文件中寻找某种模式?您是否检查过 CPU 使用情况以确认您确实受 CPU 限制?
  • 是的。仅在出现错误时打印 - 只是为了减少 IO。我没有检查 CPU 使用率。即使它不是 CPU 密集型的,我们如何才能将这个操作并行化?
  • 听起来你受 I/O 限制,在这种情况下,多个进程可能无济于事。此外,如果您只是在查找错误,请考虑使用 grep
  • Parallelize Bash Script 的可能重复项
  • 我不能使用 grep '因为某些比较取决于分布在同一文件中多行的参数值。但是让我看看你提供的另一个指针。谢谢您的帮助。在尝试多次从 bash 调用此 awk 脚本后,我会回来 :)

标签: gawk multiple-processes


【解决方案1】:

awkgawk 不会自行解决此问题。没有神奇的“使其并行”开关。你需要在某种程度上重写:

  • 按文件分片 - 解决此问题的最简单方法是并行运行多个 awks,每个文件一个。您将需要某种调度机制。 Parallelize Bash script with maximum number of processes 展示了如何在 shell 中自己编写。这需要更多阅读,但如果您想要更多功能,请查看 gearmancelery,它们应该适合您的问题
  • 更好的硬件 - 听起来您可能需要更快的 CPU 才能使其运行得更快,但这也可能是 I/O 问题。拥有来自 munin 或其他一些监控系统的 CPU 和 I/O 图表将有助于隔离在这种情况下哪个是瓶颈。您是否尝试过在基于 SSD 的系统上运行此作业?如今,这通常很容易获胜。
  • 缓存 - 可能有一些重复的行或文件。如果有足够的重复项,以某种方式缓存处理会很有帮助。如果您计算文件的 CRC/md5sum 并将其存储在数据库中,则可以计算新文件的 md5sum 并跳过处理(如果您已经这样做了)。
  • 完全重写 - 用awk 缩放这个在某些时候会变得很荒谬。使用一些 map-reduce 框架可能是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2021-04-25
    • 2011-12-05
    • 2011-05-18
    • 2012-03-05
    相关资源
    最近更新 更多