使用 mkfifo 提升文本处理的速度

目录

   mkfifo 一般用来建立一个有名字的管道,这个在实际的使用中似乎并不常见。但是我实验发现使用 mkfifo 建立的管道是进程同步的,这点就有些意思了,我们可以利用
这点直接把一个文本处理变为多进程的,还可以用这个制造一个全局的序列产生器。

序列产生器

  在编程中我们有时需要一个唯一的顺序产生的值。比如统计一个操作我们做了多少次,我们当然可以用一个临时的文件来存储这个值,每次操作对这个值进行加 1 操作,然后
把新产生的值写入到文件中保存。但是这里存在并发问题,假设同一个操作同时进行,那么这样的方式将不能满足我们的需求。我们可以直接用 mkfifo 写一个进程同步的序列产生器
#比如执行这段代码
mkfifo /tmp/f
count=0;while true; do echo $count > /tmp/f ;((count++));sleep 0.1; done

#然后我们执行下面的程序,这样我们可以不断到得到增加的数字,而且不怕并发产生的问题。
cat /tmp/f 

加速文本处理

  有了上面的例子我们很容易想到,如果对文本处理我们能直接开启多进程读取管道中的数据进行处理,是否能加快处理的速度呢。经过我实际的测试,当开启两个进程时的确
可以加快文本处理的速度。例如下面:
#我们直接处理差不多花了 50 秒
jimila@CDYJY-JINGML:crt$ time sed 's/1/2/g' t.tt >/dev/null

real	0m47.405s
user	0m45.928s
sys	0m0.494s

然后我们开启两个进程来处理这个文本
mkfifo /run/shm/map.p
cat t.tt >/run/shm/map.p 
jimila@CDYJY-JINGML:dongdong$ time sed 's/1/2/g'  </run/shm/map.p >/dev/null

real	0m26.681s
user	0m25.883s
sys	0m0.274s


jimila@CDYJY-JINGML:stelchat$ time sed 's/1/2/g'  </run/shm/map.p >/dev/null

real	0m25.752s
user	0m24.984s
sys	0m0.223s


可以看到处理这个文本总共需要的时间差不多减少了一半,可惜我发现使用超过两个进程,结果并没有明显的提升,我有点怀疑和我的 CPU 有关系,我的 CPU
是 2 核 4 线程的,下次在多核的上面测试一下。


目录