【问题标题】:Unix : Optimized command for subsituting words in large fileUnix:用于替换大文件中的单词的优化命令
【发布时间】:2014-03-18 13:46:35
【问题描述】:

此问题与任何代码问题无关。只是需要你的建议。

我们有一个 ~ 100GB 的文件,我们正在应用 sed 来替换一些参数。 这个过程需要很长时间并且会占用 CPU

awk/tr/perl 或任何其他 unix 实用程序替换 sed 是否会在这种情况下有所帮助。

注意:

time 命令以外的任何建议。

【问题讨论】:

  • 你做了什么样的替换?你知道文件中的行号吗?
  • 直观地说,越简单越好。根据这个推理,如果你不能使用tr - 这更简单,因为它根本不检查上下文;它会替换所有出现的你给它的字符 - 使用sed。然而,Perl 或 Awk 的速度更快并不是闻所未闻的,如果你找到了它们可以优化的最佳位置。衡量和比较。
  • 这是假设您当前的脚本不包含明显的错误,例如多次sed 调用就足够了。也许发布一个sn-p?
  • @tripleee 实际上 sed 命令是在循环中调用的......它执行多个文件(4 个文件)的替换......每个 ~100 GB......所以只是想知道 sed 是否是执行此类活动的正确解决方案....

标签: bash unix


【解决方案1】:

您可以做几件事来加快速度:

  • 尽可能使用固定模式匹配而不是正则表达式
  • LANG=C sed '...' 运行 sed

这两个可能会有很大帮助。其他任何事情都只会带来微小的改进,甚至是不同的工具。

关于LANG=C - 通常匹配是在您的环境设置的任何编码中完成的,可能是UTF-8,这会导致额外的UTF-8字符查找。如果您的模式只使用 ascii,那么一定要使用 LANG=C。

您可以尝试的其他方法:

  • 如果您必须使用正则表达式,则尽可能使用最长的固定字符串 - 这将允许正则表达式引擎更快地跳过文件的不匹配部分(它将跳过更大的块)
  • 尽可能避免逐行处理 - 正则表达式引擎将不必花时间寻找换行符

【讨论】:

  • 关于LANG=C,通常匹配是在您的环境设置的任何编码中完成的(有一定概率可能是UTF-8,但也可能是ISO-8859等不同的编码)。
  • 感谢您的评论,改进了答案。
  • 感谢您的建议 :)
【解决方案2】:

尝试不同的 AWK:mawk 对我来说特别快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2014-03-28
    • 2019-05-24
    • 2011-03-30
    • 1970-01-01
    • 2015-03-02
    • 2011-06-26
    相关资源
    最近更新 更多