人生苦短,我用Python!然后学学使用Shell。
任务要求
在写爬虫或是做文本数据清洗的时候,有的时候发现我们用python写的处理程序会遇到速度过慢的问题,造成这个的原因可能如下:
- Python 自身就慢
- Python 程序没有经过优化
- 处理的逻辑中带有正则
- 其它
本来数据的处理程序应该是很快的,起码应该在100s内完成一个步骤的处理,如果时间过长对于程序的调试和自动化脚本的执行都是一个很大的麻烦。所以这时候就可以利用Shell脚本的多线程的技术来完成“加速”。
大体思路
将所要处理的文本分割成很多的小文件,然后用处理脚本或是处理程序进行并行处理。(注意:如果是处理逻辑中需要对全体数据进行排序或是去重需要考虑此种方式带来的结果损失)
一个例子
# 功能:将要处理的数据先sort一下,然后按照多线程的方式处理数据,
# 加速数据的处理速度。
# $1: 数据路径名称
# $2: 多线程的数目
# 使用方法举例:bash multi.sh ../data2.step3 64 data2.step4 >multi.log
data_file=$1
thread_num=$2
output_file=$3
tmp_folder=tmp
if [ $# != 3 ];then
echo 'Please enter data and thread number and output file.'
exit
fi
rm -r $tmp_folder
mkdir -p $tmp_folder
file_name=${data_file##*/}
echo " Data name: "$file_name
echo " Thread num:" $thread_num
raw_wc=`cat $1 | wc -l`
echo " Lines num:"$raw_wc
# 计算每个线程需要处理的行数
let "line_split=raw_wc/thread_num";
echo " Split Num: "$line_split
# 先将原始数据sort
`sort $data_file>$tmp_folder/data.sort`
`split -a 2 -l $line_split $tmp_folder/data.sort tmp/$file_name.split.`
for file in `ls tmp/$file_name.split.*`
do
{
`cat $file | python remove_emoji_punck.py >>$output_file 2>>step4.log`
}&
done
wait
echo "Done!"
上面的例子就是一个利用多线程同时执行一个python脚本的shell脚本,主要Python的重定向输出一定要使用>>
增广的方式来完成。这样的话多个脚本就能同时写入了。我在这里用了一个sort
命令是因为我需要对所有的数据进行一个去重的任务,先进行排序在分割文本的话会尽量将相同内容的文本放到一起,但是可能会带来性能的损失(同样的文本可能分割到不同的小文件中,但是我的要求能够容忍这种损失)
总结:python的便利+shell的灵活 = 快速自动化处理能力
(p.s. 如果您有更好的方案,请在下方的留言区不吝赐教。大家一起学习,一起进步。)