zoukankan      html  css  js  c++  java
  • 提高python处理数据的效率方法

    处理大数据的方法有很多,目前我知道就这么多,后面会持续更新:

    一、将数据分批次读取

    csv格式是常见的数据存储方式,对于我们普通人而言易于读写。此外,在pandas中有pd.read_csv()函数可以将csv形式的数据进行读取。但当csv文件非常大的时候,直接读取会很吃内存,甚至会出现内存不够用的情况。

    这时候我们可以 分批次(分块)读取,而不是一次性读取 这么大体量的数据。操作步骤:

    1. 分批次读取
    2. 处理每一批次
    3. 保存每一批次的结果
    4. 对所有的数据重复步骤1-3
    5. 将所有的批次结果都结合起来

    pd.read_csv(chunksize) 中的chunksize指的的是每一批次的行数

    import pandas as pd	
    chunk_iterator = pd.read_csv("test.vcf",sep="	", chunksize=10000)	
    chunk_result_list = []	
    #每一批次都是dataframe类型	
    for chunk in chunk_iterator:	
        #根据你的分析问题,设计自己的chunk_manipulate函数	
        filter_result = chunk_manipulate(chunk)	
        chunk_result_list.append(filter_result)	
    #合并所有批次处理结果,形成新的dataframe	
    df = pd.concat(chunk_result_list)
    

      


    二、常用方法读取大型文件

    面对100w行的大型数据,经过测试各种文件读取方式,得出结论:

    with open(filename,"rb") as f:
      for fLine in f:
      pass
    

    这种方式最快,100w行全遍历2.7秒。

    基本满足中大型文件处理效率需求。如果rb改为r,慢6倍。但是此方式处理文件,fLine为bytes类型。但是python自行断行,仍旧能很好的以行为单位处理读取内容。


    四、文本处理效率问题

    这里举例ascii定长文件,因为这个也并不是分隔符文件,所以打算采用列表操作实现数据分割。但是问题是处理20w条数据,时间急剧上升到12s。本以为是byte.decode增加了时间。遂去除decode全程bytes处理。但是发现效率还是很差。

    最后用最简单方式测试,首次运行,最简单方式也要7.5秒100w次。

    那么关于python处理大文件的技巧,从网络整理三点:列表、文件属性、字典三个点来看看。

    1.列表处理

    def fun(x):  尽量选择集合、字典数据类型,千万不要选择列表,列表的查询速度会超级慢,同样的,在已经使用集合或字典的情况下,不要再转化成列表进行操作,比如:

    values_count = 0
    # 不要用这种的
    if values in dict.values():
      values_count += 1
    # 尽量用这种的
    if keys,values in dict:
      values_count += 1
    

    后者的速度会比前者快好多好多。

    2. 对于文件属性

    如果遇到某个文件,其中有属性相同的,但又不能进行去重操作,没有办法使用集合或字典时,可以增加属性,比如将原数据重新映射出一列计数属性,让每一条属性具有唯一性,从而可以用字典或集合处理:

    return '(' + str(x) + ', 1)'
    list(map(fun,[1,2,3]))
    

    使用map函数将多个相同属性增加不同项。

    3. 对于字典

    多使用iteritems()少使用items(),iteritems()返回迭代器:

    >>> d = {'a':1,'b':2}
    >>> for i in d.items() :
    .... print i
    ('a',1)
    ('b',2)
    >>> for k,v in d.iteritems() :
    ... print k,v
    ('a',1)
    ('b',2)
    

    字典的items函数返回的是键值对的元组的列表,而iteritems使用的是键值对的generator,items当使用时会调用整个列表 iteritems当使用时只会调用值。


     五、Datatable:性能碾压pandas的高效多线程数据处理库

  • 相关阅读:
    分布式事务总结
    正确使用HttpClient,避免出现大量CLOSE_WAIT的TCP链接
    年终总结
    不如自己读一遍AsyncTask源码
    Android支持的图片格式
    Java Annotation Tutorials
    Android中的LruCache
    Hadoop DistributedCache分布式缓存的使用
    Mapreduce设置多路径输入输出
    Ubuntu Server 12.04安装CDH5方法总结
  • 原文地址:https://www.cnblogs.com/triple-y/p/11580307.html
Copyright © 2011-2022 走看看