菜鸟利用python处理大文本数据的血泪路
2015-06-05 15:51
555 查看
1. 源数据 Like this:
格式: .csv和.txt
内容:(几十万行)
大小:64.7M 和64.8M
电脑:i5-2540M 4G内存
2.数据更新检测:
这是一些位置信息图,1和2分别是同一地区不同时期采集的数据,现检测更新的信息。假使以NDP_ID这列数据作为POI的唯一标志码。设定:
如果NDP_ID同时在两个文件中都存在,则判定为没有改变
如果NDP_ID只存在于1文件中,则判定为信息删减了
如果NDP_ID只存在于2文件中,则判定为信息增加了
3.代码主要包括三部分:
- 文件路径的读取,获得批量文件
- 文件的读取与存储
- 变化检测
但是在试验中遇到最大的问题是程序处理的时间很漫长:
程序版本 1M数据 65M数据
第一代for循环白痴程序: 60s ——
第二代列表解析程序: 40s ——
第三代改变数据存储结构: 25S ——
第四代改变key值类型: 12S ——
第五代有序列表查找: 0S 300S
不是我闲的没事,而是前几个版本的代码跑起65的数据遥遥无期,于是开始查找哪里耗时低,以及python代码书写风格。后来发现在文件遍历比较的时候耗时最大,瓶颈也在于这里,于是开始慢慢分析复杂度:
一代:复杂度m*n*3
二代:复杂度 m*n*3
三/四代:复杂度
五代:复杂度m+n
事实证明列表解析确实高效于for循环,字典查询优于普通遍历,但是最最能显著提高速度的还是改变算法降低复杂度。代码优美性无助于提高效率。
继续优化下!
格式: .csv和.txt
内容:(几十万行)
大小:64.7M 和64.8M
电脑:i5-2540M 4G内存
2.数据更新检测:
这是一些位置信息图,1和2分别是同一地区不同时期采集的数据,现检测更新的信息。假使以NDP_ID这列数据作为POI的唯一标志码。设定:
如果NDP_ID同时在两个文件中都存在,则判定为没有改变
如果NDP_ID只存在于1文件中,则判定为信息删减了
如果NDP_ID只存在于2文件中,则判定为信息增加了
3.代码主要包括三部分:
- 文件路径的读取,获得批量文件
- 文件的读取与存储
- 变化检测
但是在试验中遇到最大的问题是程序处理的时间很漫长:
程序版本 1M数据 65M数据
第一代for循环白痴程序: 60s ——
第二代列表解析程序: 40s ——
第三代改变数据存储结构: 25S ——
第四代改变key值类型: 12S ——
第五代有序列表查找: 0S 300S
不是我闲的没事,而是前几个版本的代码跑起65的数据遥遥无期,于是开始查找哪里耗时低,以及python代码书写风格。后来发现在文件遍历比较的时候耗时最大,瓶颈也在于这里,于是开始慢慢分析复杂度:
一代:复杂度m*n*3
二代:复杂度 m*n*3
三/四代:复杂度
五代:复杂度m+n
事实证明列表解析确实高效于for循环,字典查询优于普通遍历,但是最最能显著提高速度的还是改变算法降低复杂度。代码优美性无助于提高效率。
继续优化下!
相关文章推荐
- [Python]Unicode转ascii码的一个好方法
- python学习――函数式编程
- python解决接口测试获取手机验证码问题
- python K-means工具包初解
- python 自动重启服务
- python模块pygal,出图工具
- 从底层理解Python的执行
- python 对象
- python标准库 - socket
- python 导表---xls笔记
- Python基础:16面向对象概述
- 使用Python绘制热图的库
- PyQt5+python3+pycharm开发环境配置
- Python查看模块信息
- python学习――模块和模块的常用方法
- python核心编程笔记2(p426-464)
- Python学习一,基础篇
- windows下python运行的方法
- python 的sqlite3使用详解
- python 的sqlite3连接模块用法