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

一、将数据分批次读取

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="\t", 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的高效多线程数据处理库

最新文章

  1. Hibernate入门
  2. frame busting
  3. python 线程之_thread
  4. 最好的文本框样式 最漂亮的文本框样式 textbox css样式
  5. CoreCLR on Mac:体验managed exception handling
  6. python读取excel的行数
  7. -_-#setTimeout与setInterval
  8. 转:postgresql:pg_restore: [archiver] input file does not appear to be a valid archive的解决方法
  9. Java单元测试之覆盖率统计eclemma
  10. WOW.js – 让页面滚动更有趣
  11. Android进阶(二十六)MenuInflater实现菜单添加
  12. kubernetes集群pod使用tc进行网络资源限额
  13. 深入理解JavaScript原型:prototype,__proto__和constructor
  14. Spring将Bean导入IOC容器
  15. block(八)作用域
  16. empty是判断一个变量是否为“空”,而isset 则是判断一个变量是否已经设置
  17. 渗透测试===kali linux的安装
  18. 【洛谷 P3168】 [CQOI2015]任务查询系统(主席树)
  19. [转]Algolia的分布式搜索网络架构
  20. 一.复习GCC编译器的用法

热门文章

  1. nginx配置文件解释
  2. 第01组 Alpha事后诸葛亮
  3. 获取最新的中国IP的脚本,给ROS可以使用的脚本
  4. Spring Cloud Greenwich.SR4 发布了,跟不上了……
  5. react-native字体react-native-vector-icons在ios下的使用
  6. 【原】无脑操作:Webstorm集成Git/Github
  7. promise、async和await
  8. Centos修改swap分区大小
  9. [转帖]从 SOA 到微服务,企业分布式应用架构在云原生时代如何重塑?
  10. vue的package.json文件理解