加速python科学计算的方法(二)

好久不见。有一年了。

很久没有更推文了,我的错。额,进入正题吧。到了年底,很多App都会放出“你今年听了多少歌”、“你今年看了多少帖子”、“你今年剁手了多少次”等等的用户数据,并在其中进行较多的数据挖掘工作。

很多时候,我们在处理大量数据的时候,电脑硬件都会出现各种不同的限制,内存就是最容易出现瓶颈的地方。没有足够的内存,很多数据分析工作都无法开展。

然而内存价格较贵,尤其是在2017年下半年三星公司利用自己的市场地位疯狂提高内存条价格,成功使得内存条成为了去年最佳的理财产品。

我们前提假设你在用python进行数据分析时主要使用的是Numpy和pandas库,并且数据本身是存储在一般的硬盘里的。那么在这种情况下进行分析数据时可不可以尽量减少对内存的依赖呢?有很多办法可以做到。比如利用数据库技术,如MySQL、SQLserver、Spark、Hadoop等等。但是,这个不仅会加重学习和开发工作(因为我们的重心还是在分析数据上,而不是在其他外围操作上),而且会加大之后的调试难度。pandas中有个chunksize可以用,但是要写循环,而且这样无法进行快速地分组等运算,限制挺多的。一个很不错的库可以帮到我们,那就是dask。

Dask库是一个分析型并行运算库,在一般规模的大数据环境下尤为好用。假如你对Numpy和pandas具有一定的熟悉程度,那么当使用这个库时,完全不必考虑学习难度了,因为其调用语法基本上和Numpy以及pandas内部是一样的,可以说是无缝兼容了。此外,最最不需要考虑的就是电脑有限的内存空间了。因为它同一般的数据库技术一样,是直接在硬盘上操作数据的。

下面我们从安装dask开始简单说说它的用法。

由于该库在anaconda、canopy等IDE下不是内置的,所以首先需要用pip命令安装一下:

安装完毕后即可开始导入数据。

dask默认的导入方式同pandas基本一致且更有效率。

比如我想导入该目录下的所有txt文件(共15G,大于我内存容量)。同pandas一样,一个read_table函数即可搞定。注意导入文件名那里,一个*号则表示匹配所有字符,即全部导入;你也可以自行设定匹配规则,比如“2017*.txt”则表示匹配该目录下所有以2017开头的txt文件。回车就会立马返回。

这时候我自己都会有疑问了。这么大的数据,这么快就导入了?你是不是玩我啊?实际上并没有真正的导入。此时的raw变量相当于只是一个“计划”,告诉程序“诶,待会儿记得把这些文件拿来处理哈”,只占很小的空间,不像pandas那样,只要read后就立马存在内存中了。

那dask这样做的好处是什么?第一点不用说,基本不占内存。第二点,让用户可以更快速地制定数据流动方向。这里的raw代表了之前导入的所有txt文件,你对它之后的操作则是同时作用于全部文件的。用下图可以形象地解释这个问题:

文件这么导入之后,剩下的工作几乎和在pandas中一样了,这就取决你想怎么分析这些数据了。有一点需要注意的是,你对raw的操作都不会真正的运算下去,只会继续添加计划,至于当我们使用compute()函数时它才会真正开始运算,并返回pandas.DataFrame格式的对象。当我们把整个计划框架搭建好了,比如我们有以下处理流程:

(1)先导入;

(2)添加一列Z字段,计算规则是raw的X列和Y列的和:raw[‘Z’]=raw[‘X’]+raw[‘Y’]

(3)把Z字段中等于0的样本都挑选出来,new=raw[raw[‘Z’]==0]

(4)返回DataFrame格式的new对象,new=new.compute()

在以上数据处理的计划中,只有执行到第(4)步时程序才会真正动起来,此时可以观察内存使用量,一定不会溢出的,而且CPU会满载全速运算,这一点在处理大数据时真的非常使用。如果你在处理大数据时遇到MemoryError,提示内存不足时,强烈建议试试dask。一个高效率并行的运算库。

乍一听,感觉dask好像很牛逼,是不是Numpy和pandas中所有的操作都可以在dask中高效地实现呢?不存在的。dask也有自身的瓶颈。Dask之所以可以高效并行运算,是因为开发小组重写了大量的Numpy和pandas的API,但是,正如他们自己所说的:API is large。所以还有很多API还没有得到重写,自然也就不支持在dask中运算了。

可以高效运用的功能主要有以下部分(太多了,我懒,所以就直接官网截图的):

其实基本上包括了所有常用的方面了,该有的都有了。比如分组、列运算、apply,map函数等。还是,其使用限制主要有:

1.设定Index和与Index相关的函数操作。因为dask同时操作所有的导入文件,此时设定index即要求dask把每个文件的每个记录都遍历一遍,代价是昂贵的。

2.无法sort排序。

3.我还没发现。

简单地说,只要要求不苛刻,用dask准没错。

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

如何阅读大牛的代码

一、代码阅读的必要性 阅读别人的代码作为开发人员是一件经常要做的事情。一个是学习新的编程语言的时候通过阅读别人的代码是一个最好的学习方法,另外是积累编程经验。如...

32640
来自专栏樊华恒的专栏

海量之道系列文章之弱联网优化 (六)

基于一个快速和高效管理的链路之上,做好IO调度和控制,也是提升效能和改善用户体验的重要环节,本节主要来探讨 IO 管理与 强监控。

41300
来自专栏take time, save time

八个commit让你学会爬取京东商品信息

我发现现在不用标题党的套路还真不好吸引人,最近在做相关的事情,从而稍微总结出了一些文字。我一贯的想法吧,虽然才疏学浅,但是还是希望能帮助需要的人。博客园实在不适...

31840
来自专栏带你撸出一手好代码

神秘的力量:信息隐藏

「信息隐藏」在软件开发领域中是一个非常重要的核心要点, 它的另一个名称叫做「封装」, 但是因为现代面向对象技术流行的原因, 「封装」似乎已被视为和private...

29270
来自专栏吉浦迅科技

DAY53:阅读Profiler Counter Function

Each multiprocessor has a set of sixteen hardware counters that an application c...

8920
来自专栏极客生活

数据分析sql技能之时间处理

其中current_date获取今天的日期,convert_tz函数对某个时间进行时区转换,比如我们直接current_date获得的是北京时间,如果我们需要转...

9120
来自专栏web前端教室

javascript中那些可以连成片的点

JavaScript的提高,是一点一滴的提高,这些点滴连接成线,进而连接成为一个面。 这个“面”的知识你都会了之后,会首先从某个点上形成突破再提高,然后这些再提...

21360
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试复习大纲更新1.0(持续更新)

1、背熟你的简历 原因:面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到的项目、技...

50840
来自专栏拂晓风起

Flash本地传递大数据,图片数据,localconnection 超出大小,超出限制 bitmapdata

14140
来自专栏深度学习计算机视觉

分析类的角色

1-边界类 1-O 负责系统与外界(最终用户)的通讯与交互 职责:转换和翻译交互事件 对内:将外界不同格式的时间和信息 转换为内部能够识别的格式 常见的边...

22440

扫码关注云+社区

领取腾讯云代金券