一行代码,Pandas秒变分布式,快速处理TB级数据
刚刚在Pandas上为十几KB的数据做好了测试写好了处理脚本,上百TB的同类大型数据集摆到了面前。这时候,你可能面临着一个两难的选择:
继续用Pandas?可能会相当慢,上百TB数据不是它的菜。
(ಥ_ಥ) 然而,Spark啊分布式啊什么的,学习曲线好陡峭哦~在Pandas里写的处理脚本都作废了好桑心哦~
别灰心,你可能真的不需要Spark了。
加州大学伯克利分校RiseLab最近在研究的Pandas on Ray,就是为了让Pandas运行得更快,能搞定TB级数据而生的。这个DataFrame库想要满足现有Pandas用户不换API,就提升性能、速度、可扩展性的需求。
研究团队说,只需要替换一行代码,8核机器上的Pandas查询速度就可以提高4倍。
其实也就是用一个API替换了Pandas中的部分函数,这个API基于Ray运行。Ray是伯克利年初推出的分布式AI框架,能用几行代码,将家用电脑上的原型算法转换成适合大规模部署的分布式计算应用。
Pandas on Ray的性能虽说比不上另一个分布式DataFrame库Dask,但更容易上手,用起来和Pandas几乎没有差别。用户不需要懂分布式计算,也不用学一个新的API。
与Dask不同的是,Ray使用了Apache Arrow里的共享内存对象存储,不需要对数据进行序列化和复制,就能跨进程通讯。
△ 在8核32G内存的AWS m5.2xlarge实例上,Ray、Dask和Pandas读取csv的性能对比
它将Pandas包裹起来并透明地把数据和计算分布出去。用户不需要知道他们的系统或者集群有多少核,也不用指定如何分配数据,可以继续用之前的Pandas notebook。
前面说过,使用Pandas on Ray需要替换一行代码,其实就是换掉导入语句。
# import pandas as pd
import ray.dataframe as pd
这时候你应该看到:
初始化完成,Ray自动识别了你机器上可用的核心,接下来的用法,就和Pandas一样了。
Pandas on Ray目前还处于早期,实现了Pandas的一部分功能。以一个股票波动的数据集为例,它所支持的Pandas功能包括检查数据、查询上涨的天数、按日期索引、按日期查询、查询股票上涨的所有日期等等。
这个项目的最终目标是在Ray上完整实现Pandas API的功能,让用户可以在云上用Pandas。
目前,伯克利RiseLab的研究员们已经用45天时间,实现了Pandas DataFrame API的25%。
革命尚未成功,项目仍在继续。这些人都在为之努力:
Devin Petersohn, Robert Nishihara, Philipp Moritz, Simon Mo, Kunal Gosar, Helen Che, Harikaran Subbaraj, Peter Veerman, Rohan Singh, Joseph Gonzalez, Ion Stoica, Anthony Joseph
更深入地了解Pandas on Ray请看RiseLab博客原文: https://rise.cs.berkeley.edu/blog/pandas-on-ray/
试用Pandas on Ray请参考这个文档: https://rise.cs.berkeley.edu/blog/pandas-on-ray/
给Ray团队提要求请到GitHub开issue: https://github.com/ray-project/ray/issues
如果对Ray感兴趣,可以读一读他们的论文: https://arxiv.org/abs/1712.05889
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringBoot微服务架构项目--Union社交平台
- 如何衡量前端基建的效能价值?
- mbedtls | 移植mbedtls库到STM32裸机的两种方法
- 实用小技巧 | 用socket玩转http接口
- 深度学习之人脸识别模型--FaceNet
- Java常用的设计模式
- HW防守|应急溯源分析手册汇总篇
- Python进阶(一)
- Python版本的OpenCV安装
- CVE-2020-16875:Microsoft Exchange RCE复现
- 抢先学鸿蒙(HarmonyOS)2.0,你就是下一个大咖!
- Python高效编程之88条军规(2):你真的会格式化字符串吗?
- 搭建Typecho博客
- Python开发之Pandas的使用
- Python开发之numpy的使用