1.为什么要使用modin?
Modin 是加州大学伯克利分校 RISELab 的一个早期项目,旨在促进分布式计算在数据科学领域的应用。它是一个多进程的数据帧(Dataframe)库,具有与 Pandas 相同的应用程序接口(API),使用户可以加速他们的 Pandas 工作流。
该系统是为希望程序运行得更快、伸缩性更好,而无需进行重大代码更改的 Pandas 用户设计的。这项工作的最终目标是能够在云环境中使用 Pandas。
我们在使用pandas进行数据处理时难免出现性能瓶颈,在实际工作生产中pandas操作百万高维数据时,性能不足的问题会逐步放大,这与pandas的单核运行机制相关,pandas在将大数据量加载入缓存时,会将庞大的dataframe同时拷贝入缓存中。
2.modin与pandas的性能对比实例
我们来看一下使用modin分布式并行加速后pandas与原始pandas对比
1.首先我们先创建一个计算运行时间的装饰器,并分别导入modin与pandas,并设置导入数据的路径
导入数据为一份石家庄poi数据,数据量为40w左右,特征数15,数据大小在105mb
让我们看看modin与pandas在这个级别数据加载速度的对比
import pandas as pd
import modin.pandas as mpd
import os
import time
path = '/Users/mac/Desktop/data_processing/poi/untitled folder/石家庄市poi_20200108.csv'
def time_out(func):
def inner(*arg, **kwargs):
start = time.clock()
r = func(*arg, **kwargs)
end = time.clock()
print(end-start)
return r
return inner
这是个装饰器可以计算单个函数所运行的时间
随后分别使用modin与pandas针对同一份数据进行数据加载dataframe类型并存入缓存中
@time_out
def modin_read():
data = mpd.read_csv(path)
return data
@time_out
def pd_read_time():
data1 = pd.read_csv(path)
return data1
if __name__ == '__main__':
modin_read()
pd_read_time()
通过运行这段代码可以得到
/usr/local/bin/python3.6 /Users/mac/PycharmProjects/jxw_test_sp/pyspark_lou/project.py
0.16381800000000002
1.714888
Process finished with exit code 0
通过装饰器计算我们可以清楚看到,使用modin加速后相比原始pandas性能提升10倍有余。
这样来看modin加速后的pandas可以完全取缔原始pandas,可事实真的是这样嘛?
于是我又将另一组数据进行加载测试,这组数据量为11000,特征数为12,大小大约为2.2mb。让我们看下modin在小数据量下表现如何。
/usr/local/bin/python3.6 /Users/mac/PycharmProjects/jxw_test_sp/pyspark_lou/project.py
0.15624100000000007
0.09584199999999998
Process finished with exit code 0
我们发现modin在小数据量下性能反而不如原始pandas,这也是在意料之中,由此可知有经验的数据科学家在modin与pandas在实际使用上,会根据数据量大小从而选择相对合适的,而并行计算过程中必然存在一个数据量的阀值,在阀值上modin与pandas性能相同。而导致modin与pandas出现差异的原因是什么呢?下面我们就一起来探究下
3.modin性能优化的原理
在具有 4 个 CPU 内核的现代笔记本上处理适用于该机器的数据帧时,Pandas 仅仅使用了 1 个 CPU 内核,而 Modin 则能够使用全部 4 个内核。
在多核条件下,modin可以充分提升cpu的利用率,使数据处理效率大大提升。
modin拥有两种分布式计算框架分别是Desk和Ray,在不进行提前设定时,modin默认使用Ray,Ray是一种应用于机器学习与强化学习场景的分布式执行框架,可以实现多端分布式计算,从而提升性能,而在单台服务器上又可以以多进程的方式实现并行计算,并完美与modin相结合实现对pandas操作的并行加速。
现今,Ray只适用于mac与Linux环境下,不支持windows相关操作
modin针对并行操作所做的优化分别体现在对dataframe数据类型的切割与特征分离。我们可以简单的理解为针对dataframe行与列的拆分,将拆分后的dataframe分配到不同的cpu内核中进行计算,再将计算结果相互组合还原,从而实现并行计算。