跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 如何提高 awk 的计算速度
未分類
14 6 月 2020

如何提高 awk 的计算速度

如何提高 awk 的计算速度

資深大佬 : deasty 7

有一个 50M 的文本,90 多万行,每行有个数字,用 shell 写个脚本用 awk 取数后经过一个幂运算再输出到新文本,7 个小时过去了,才完成 20 多万行,如何能提高这个效率?
大佬有話說 (26)

  • 資深大佬 : amoia50

    python 不香吗[狗头]

  • 資深大佬 : iintothewind

    xargs, parallel 都可以并行处理 可以试试

  • 資深大佬 : rrfeng

    每行只有一个数字?没别的?
    运算具体是啥?

    你这相当于没说,咋分析

  • 資深大佬 : delectate

    7 小时大约 25200s,处理 20w 行,一秒 10 行,不够快。
    要么 py+多进程,要么像上说的并行处理,或者干脆把文件拆分,然后多个一起跑也行。

  • 資深大佬 : FrankHB

    为什么非要制造瓶颈?这种简单任务你用 C 临时糊个都不用几分钟,省下几个小时不香吗……

  • 資深大佬 : lululau

    单行命令的文本处理,python 真不香,sed awk perl ruby 不知道香到哪里去了,你也配叫脚本语言

  • 資深大佬 : CEBBCAT

    上次可能是计算 int64 的移位,awk 确实没有 Python 快,我跑起来一会儿 awk 了发现还没跑好,然后再开了一个终端去写 Python,等我写完跑出结果了 awk 还是没有算完。

    上这么说有什么依据吗?

  • 資深大佬 : momocraft

    “经过一个幂运算” 是 awk 自己的计算吗?

  • 資深大佬 : layorlayor

    把代码贴出来吧。感觉不应该这么慢

  • 資深大佬 : lululau

    @CEBBCAT 举两个最简单也最常见的例子:

    文本替换:

    sed ‘s///’
    gawk ‘gsub()’
    perl -pe ‘s///’
    ruby -pe ‘gsub!()’

    取一列并做变换:

    gawk ‘{print $1*2}’
    perl -alne ‘print $F[0]*2’
    ruby -ane ‘puts $F[0].to_i * 2’

    欢迎下用 python 弄一个更简单的写法来打脸

    还忘了说最近看到的一个行列结构文本处理的瑞士军刀 miller

  • 資深大佬 : ylrshui

    估计 excel 都比这快

  • 資深大佬 : thedog

    awk 不应该那么慢吧,很多时候,这种简单任务,awk 比 python 快的。

  • 資深大佬 : runze

    代码贴出来看看? awk 虽然不算快,但绝不至于慢到这种程度

  • 資深大佬 : TimePPT

    这么规整的结构,还要做计算。pandas 很香的

  • 資深大佬 : ygtq

    show me the code 🙂

  • 資深大佬 : xlcoder166

    现有代码不变的思路 – 分治

    1. 拆原文件至 90W / n ( CPU 核心数)个文件
    2. shell 并行处理 拆分的文件

  • 資深大佬 : youngster

    估计不是 awk 慢,是你运算太慢,换个换个运算快的语言应该都能解决

  • 資深大佬 : layorlayor

    awk -F’|’ ‘{print $2*1024*1024″|”$0}’ 这个很快呀

  • 資深大佬 : layorlayor

    awk -F’|’ ‘{print $2*1024*1024″|”$0} input.txt > output.txt

  • 資深大佬 : Vegetable

    你这脚本写的是个啥,处理单行文本还有 for 循环?看着就害怕

  • 資深大佬 : Vegetable

    btw,1024*1024 就是 2**20

  • 資深大佬 : klesh

    测试命令:
    seq 0 10000 | awk ‘{print “foo|”$1″|bar”}’ > test.txt
    time awk -F’|’ ‘{print $2*1024*1024″|”$0}’ test.txt

    结果:
    10484711424|foo|9999|bar
    10485760000|foo|10000|bar

    ________________________________________________________
    Executed in 76.44 millis fish external
    usr time 54.70 millis 0.00 micros 54.70 millis
    sys time 21.51 millis 962.00 micros 20.54 millis

    硬件
    CPU: Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
    SSD: SanDisk SD8SB8U5

  • 資深大佬 : Kelan

    这么小的文本跑 7 个小时有点离谱了把。

  • 資深大佬 : 0x11901

    说实话每次遇到这种问题总有一群人说用 python 不香么……

    真是应了那句老话:当你手上有一把锤子的时候,看所有的东西都是钉子

  • 資深大佬 : freelancher

    结果是个啥。得说呀。还是说附言二就解决了?

  • 資深大佬 : Semidio

    @freelancher #24 注意看 18L 和附言 2 的区别

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具