如何提高 awk 的计算速度

2020-06-18 08:55:14 +08:00
 deasty
有一个 50M 的文本,90 多万行,每行有个数字,用 shell 写个脚本用 awk 取数后经过一个幂运算再输出到新文本,7 个小时过去了,才完成 20 多万行,如何能提高这个效率?
3452 次点击
所在节点    问与答
26 条回复
amoia50
2020-06-18 08:58:21 +08:00
python 不香吗[狗头]
iintothewind
2020-06-18 09:05:47 +08:00
xargs, parallel 都可以并行处理 可以试试
rrfeng
2020-06-18 09:07:36 +08:00
每行只有一个数字?没别的?
运算具体是啥?

你这相当于没说,咋分析
delectate
2020-06-18 09:08:00 +08:00
7 小时大约 25200s,处理 20w 行,一秒 10 行,不够快。
要么 py+多进程,要么像楼上说的并行处理,或者干脆把文件拆分,然后多个一起跑也行。
FrankHB
2020-06-18 09:14:10 +08:00
为什么非要制造瓶颈?这种简单任务你用 C 临时糊个都不用几分钟,省下几个小时不香吗……
lululau
2020-06-18 09:15:01 +08:00
单行命令的文本处理,python 真不香,sed awk perl ruby 不知道香到哪里去了,你也配叫脚本语言
CEBBCAT
2020-06-18 09:25:54 +08:00
上次可能是计算 int64 的移位,awk 确实没有 Python 快,我跑起来一会儿 awk 了发现还没跑好,然后再开了一个终端去写 Python,等我写完跑出结果了 awk 还是没有算完。

楼上这么说有什么依据吗?
momocraft
2020-06-18 09:50:38 +08:00
"经过一个幂运算" 是 awk 自己的计算吗?
layorlayor
2020-06-18 09:51:39 +08:00
把代码贴出来吧。感觉不应该这么慢
lululau
2020-06-18 09:52:55 +08:00
@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
2020-06-18 10:10:31 +08:00
估计 excel 都比这快
thedog
2020-06-18 10:30:38 +08:00
awk 不应该那么慢吧,很多时候,这种简单任务,awk 比 python 快的。
runze
2020-06-18 10:37:07 +08:00
代码贴出来看看? awk 虽然不算快,但绝不至于慢到这种程度
TimePPT
2020-06-18 10:41:56 +08:00
这么规整的结构,还要做计算。pandas 很香的
ygtq
2020-06-18 10:45:51 +08:00
show me the code :)
xlcoder166
2020-06-18 10:46:57 +08:00
现有代码不变的思路 - 分治

1. 拆原文件至 90W / n ( CPU 核心数)个文件
2. shell 并行处理 拆分的文件
youngster
2020-06-18 10:56:11 +08:00
估计不是 awk 慢,是你运算太慢,换个换个运算快的语言应该都能解决
layorlayor
2020-06-18 10:58:48 +08:00
awk -F'|' '{print $2*1024*1024"|"$0}' 这个很快呀
layorlayor
2020-06-18 11:03:22 +08:00
awk -F'|' '{print $2*1024*1024"|"$0} input.txt > output.txt
Vegetable
2020-06-18 11:05:14 +08:00
你这脚本写的是个啥,处理单行文本还有 for 循环?看着就害怕

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/682534

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX