首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >加速python科学计算的方法(二)

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

作者头像
企鹅号小编
发布2018-01-08 17:43:29
1.5K0
发布2018-01-08 17:43:29
举报
文章被收录于专栏:大数据大数据

好久不见。有一年了。

很久没有更推文了,我的错。额,进入正题吧。到了年底,很多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准没错。

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

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档