为什么可以这么快! awk 与python的应用

这几天刚处理一个排序问题

源文件: 可以看到有11G大小,需要根据最后一列的热度来做一下排序.如果让你来做这样的排序,在linux环境下,你会如何处理呢?

xch27@lanzhou:/asrdata/users/xch27/lmwork/comm_cloud/aicar_solution/v32_30june2017/data/navi/slot/big$ ls -lh 全量数据_0620.txt 
-rw-r--r--. 1 xch27 alab 11G 7月   4 18:26 全量数据_0620.txt
xch27@lanzhou:/asrdata/users/xch27/lmwork/comm_cloud/aicar_solution/v32_30june2017/data/navi/slot/big$ head 全量数据_0620.txt
北京南顺油脂有限公司    BeiJing NanShun YouZhi YouXianGongSi        良乡南肖庄道口西    公司企业;公司;公司    北京市    北京市    房山区    9.6901977
松园派出所    SongYuan PaiChuSuo        松园村    政府机构及社会团体;公检法机构;公安警察    北京市    北京市    昌平区    3004.3764856
西园村    XiYuanCun            地名地址信息;普通地名;村庄级地名    北京市    北京市    昌平区    73.406943
仁和镇人民政府    RenHeZhen RenMin ZhengFu    仁和镇政府    顺平西路9号    政府机构及社会团体;政府机关;乡镇级政府及事业单位    北京市    北京市    顺义区    2374.4912286
中国建设银行(北京三元桥支行)    ZhongGuo JianShe YinHang (BeiJing SanYuan Qiao ZhiHang)        左家庄路1号国门大厦B座1层    金融保险服务;银行;中国建设银行    北京市    北京市    朝阳区    2617.5249994
北京糖业烟酒集团有限公司酒类经营分公司    BeiJing TangYe YanJiu JiTuan YouXianGongSi Jiu LeiJingYing FenGongSi        永定路23号    公司企业;公司;公司    北京市    北京市    海淀区    1434.2144127
东马坊小学    DongMaFang XiaoXue        东马坊20号    科教文化服务;学校;小学    北京市    北京市    海淀区    2549.257087
北辰汇宾大厦    BeiChen HuiBin DaSha        北辰东路8号院-5    商务住宅;楼宇;商务写字楼    北京市    北京市    朝阳区    10420.9972344
北京世纪银嘉文化发展有限公司    BeiJing ShiJi YinJia WenHua FaZhan YouXianGongSi        花园路30号花园商务会馆6层6216    公司企业;公司;公司    北京市    北京市    海淀区    
向明食品店    XiangMing ShiPinDian        南二环与南二环出口交叉口西南50米    购物服务;便民商店/便利店;便民商店/便利店    北京市    北京市    东城区    3.3185239

方法一:

我首先用python来解决:   可以看出代码还是略显复杂,其中排序算法,我用的是列表自带的sort方法,也可以自己写,参考上一篇文章,用里面的归并排序.但是这个程序最大的问题是什么?有两个,一个是慢,另一个是太耗内存

我用的是超算集群跑的,本地程序肯定卡死了,下面我贴了张top的截图,可以看看他用了多少内存,跑了多久,我写这篇记录的时候还没跑完呢,我看看他要跑多久.

#!/usr/bin/python
#coding=utf-8
#__author__='dahu'
#data=2017-
# 处理数据,整理成标准格式
import sys,collections
from operator import itemgetter
def file_pro(filename):
    with open(filename,'r') as f:
        for line in f:
            yield line

if __name__ == '__main__':
    gen=file_pro(sys.argv[1])
    #gen=file_pro('tmp')
    block=collections.OrderedDict()
    ll=[]
    with open(sys.argv[2],'w') as f:
        #with open('new_tmp.sort', 'w') as f:
        k=0
        for line in gen:
            line_list=line.split('\t')
            line_list=[line.strip() for line in line_list]
            value=['名称','拼音','别称','地址','类型','','','区县','热度']
            block=collections.OrderedDict(zip(value,line_list))
            a=0 if block['热度']=='' else block['热度']
            block['热度']=float(a)
            ll.append(block.copy())
            block.clear()

        ll.sort(reverse=True,key=itemgetter('热度'))

        for i in ll:
            for key in i:
                f.write('%s:%s\n'%(key,i[key]))
            f.write('\n')
            if not k%100000:
                print k
            k+=1
xch27@taiyuan:/asrdata/users/xch27/lmwork/comm_cloud/aicar_solution/v32_30june2017/data/navi/slot$ python lineprocess_sort.py 全量数据_0620.txt lineprocess_sort.txt

 

方法2:

这个就牛逼了,10min就搞完了,顺序已经排好了,格式就不是问题了,再用awk修改下输出格式就ok了,看来大量数据的处理方式还是尽量少用python,  linux 自带的awk和其他的实用程序是个不错的选择.~

#awk '{printf("%f>>>%s\n",$NF,$0)}' 全量数据_0620.txt|sort -nr > awk.method.txt  #非常快速的一个方法!比python快n倍

 

posted @ 2017-07-04 21:40  dahu1  Views(1379)  Comments(0Edit  收藏  举报