Copyright@HuaHuaJiangLeetCode
EP3 事件处理
例子:Command-Line Tools can be 235x Faster than your Hadoop Cluster
创建处理管道
背景
- 下载数据
可以在一个github rozim/ChessData上下载测试数据
- 读取速度测试
1 | cat *.pgn > /dev/null |
这是文件处理速度的上限
*.pgn
以参数列表的形式返回所有匹配的文件 cat 1.pgn 2.pgn ... 100.pgn
/dev/null
是一个设备文件,它丢弃一切写入的数据但返回写入成功
版本1
搜索指定行
- $ cat
*.pgn
| grep “Result”
- $ cat
最简单的版本
- $ cat
*.pgn
| grep “Result” | sort | uniq =c
- $ cat
知识点
sort 对输入文本进行排序
uniq -c 统计每个独立行的出现次数 仅对已排序文件有效
*.pgn
参数/文件数量限制 262144 个$ getconf ARG_MAX
可以获取sort 会把所有数据读入内存,如果内存存不下则会写入临时文件
- 时间复杂度:O(nlogn)
- 空间复杂度:O(n)
uniq -c
- 时间复杂度:O(n)
- 空间复杂度:O(1)
版本2 awk
AWK is a domain-specific language designed for text processing and typically used as a data extraction and reporting tool.
1 | $ cat *.pgn | grep "Result" | awk '{ split($0, a, "-"); res = substr(a[1], length(a[1]), 1); if (res == 1) white++; if (res == 0) black++; if (res == 2) draw++;} END { print white+black+draw, white, black, draw }' |
知识点
- $0 # 输入行 ‘[Result “1/2-1/2”]’
- split($0, a, “-“) # 按-分割 a=[‘[Result “1/2’, ‘1/2”]’]
- substr(a[1], length(a[1]), 1) # 取出最后一个字符
时间复杂度:O(n),空间复杂度:O(1)
版本3 并行化
1 | $ sleep 3 | sleep 5 | echo '8' |
管道中的命令并行执行
- 代码我看不懂了,也懒得敲了。放图!
知识点
find 查找文件,打印匹配文件名到标准输出
xargs 将参数列表(文件名)分段并执行命令
- -n 每次(最多)取几个参数
- -p 最多几个命令同时并行执行
mawk 合并结果