字符串操作是数据科学的重要组成部分。Vaex的最新版本为所有常见的字符串操作添加了令人难以置信的速度和内存利用效率。与Pandas(Python生态系统中最受欢迎的DataFrame库)相比,四核笔记本电脑上的字符串操作速度提高了约30-100倍,而32核设备上的字符串操作速度提高了1000倍。
虽然Pandas主要负责Python在数据科学中的普及,但它非常消耗内存。随着数据变得越来越大,你必须小心不会出现内存错误MemoryError。切换到功能更强大的机器可能会解决一些内存问题,但现在你的其他31个核心处于空闲状态。Pandas只会使用你花哨机器的32个核心中的一个。使用Vaex,所有字符串操作都在并行执行,并且可以延后进行评估,从而可以毫不费力地处理十亿行数据集。
“字符串处理快了近1000倍,相当于1分钟而不是15小时!”
Vaex和超弦
Vaex现在正在超越快速数字运算,扩展到超级字符串领域。最新版本包括几乎所有Pandas的字符串操作。您现在可以快速地执行所有字符串操作,如通过计算包含一个googol(即10的100次方)行的DataFrame中的字符串长度所证明的那样。
googol长度DataFrame演示了惰性求值的优势。在对输入错误的输入数据进行正则表达式试验时,您无需等待一分钟即可查看所有操作是否正常。相反,您应用您的操作,打印出数据帧,并直接看到预览(头部和尾部),没有任何延迟。仅评估您看到的值。
绩效基准
最终,您必须处理所有数据。惰性评估并没有加速操作,只是推迟了。如果您需要导出数据或将其传递给机器学习库,它最终需要发生吗?那么vaex的表现如何?让我们拍摄一个包含1亿行的人工数据集 ,并使用Pandas和Vaex执行相同的操作(Spark稍后会出现):
(注意:越大越好,x是对数。与四核笔记本电脑或32核心机器上的Pandas相比,Vaex的加速比较。在个人笔记本电脑上,可以预期30-100倍的加速,在AWS h1.8xlarge(32核心)上,我们测得接近1000倍的加速!)
Vaex在我的四核笔记本电脑上的运行速度提高了约190倍,在AWS h1.x8大型机器上甚至快了~1000倍!最慢的操作是正则表达式,这是可以预见到的,因为正则表达式是CPU密集型的,这意味着大部分时间花在操作上而不是围绕它们的所有记录操作。简而言之,Python的开销很低,而且Python的正则表达式引擎已经很快了,因此我们只能在加速时获得10-60倍的因子。
方法:GIL,C++和ApacheArrow
这怎么可能呢?涉及三个成分:C++,Apache Arrow和Global Interpreter Lock GIL(GIL)。在Python中,多线程受到GIL的阻碍,使得所有纯Python指令都有效地单线程化。迁移到C++时,可以释放GIL并使用计算机的所有内核计算力。为了利用这一优势,Vaex在C++中完成所有字符串操作。
下一个要素是定义内存和磁盘上的数据结构,这种结构在内存使用方面是有效的,这就是Apache Arrow发挥作用的地方。Apache Arrow定义了一个经过深思熟虑的StringArray,它可以存储在磁盘上,对CPU很友好,甚至还支持masked / null值。最重要的是,这意味着支持Apache Arrow格式的所有项目都可以使用相同的数据结构,而无需进行任何内存复制。
什么关于Dask?
人们经常会问Dask如何与Vaex进行比较。Dask是一个很棒的库,允许Python的并行计算。实际上将来Vaex很有可能在Dask的基础上进行重构,但是它们无法进行比较。Vaex 可以与dask.dataframe进行比较,这是一个使用Dask并行化Pandas的库。对于我们运行的基准测试,dask.dataframe实际上比纯Pandas慢(~2x)。由于Pandas字符串操作不释放GIL,因此Dask无法有效地使用多线程。围绕GIL的方法是使用Dask中的进程。然而,与Pandas相比,这使得操作速度减慢了40倍,与Vaex相比,它放慢了1300倍(!)。大部分时间都花在pickling和unpickling字符串上。
【知识点】为了让用户在平常的编程和测试时保存复杂的数据类型,python提供了标准模块,称为pickle.这个模块可以将几乎任何的python对象(甚至是python的代码),转换为字符串表示,这个过程称为pickling.而要从里面重新构造回原来的对象,则称为unpickling.在pickling和unpicking之间,表示这些对象的字符串表示,可以存于一个文件,也可以通过网络远程机器间传输。
虽然Dask是一个很棒的库,但是dask.dataframe不能在字符串领域高效率执行。它继承了Pandas的一些问题,使用流程会因为picklin/unpickling而产生很大的开销。虽然可能有办法加快速度,但开箱即用的性能对于字符串来说并不是很好。
Spark怎么样?
Apache Spark是JVM/Java生态系统中用于处理数据科学的大型数据集的库。如果Pandas无法处理特定数据集,人们通常会使用PySpark(Python包装器/绑定到Spark)。如果您的工作是产生结果,而不是在本地或甚至在群集中设置Spark,这是一个额外的障碍。因此我们还针对相同的操作对Spark进行了基准测试:
(注意:越大越好,x是对数。比较Vaex,Pandas和Spark)
Spark比Pandas表现更好。我们惊讶地看到vaex比Spark做得更好。总的来说,如果您想在笔记本电脑上进行互动,我们可以说:
Pandas将按每秒数百万字符串的顺序进行(并且不会缩放)Spark将以每秒1000万个字符串的顺序执行(并且将随着核心数量和计算机数量而扩展)。Vaex每秒可以处理大约1亿个字符串,并且会随着核心数量的增加而扩展。在32核机器上,我们每秒可以获得10亿个字符串。注意:某些操作将按字符串长度进行缩放,因此绝对数字可能会因问题而异。
未来
Pandas将永远存在,因为它的灵活性是无与伦比的,并且对于Python在数据科学中的普及负有很大的责任。但是,当数据集变得太大而无法处理时,Python社区应该有更好的选择。Dask.dataframe试图通过构建在Pandas之上来搞定大型数据集,但继承了Pandas的问题。或者,NVIDIA的cuDF(RAPIDS的一部分)通过使用GPU来解决性能问题,但需要一个现代的NVIDIA显卡,具有更多的内存限制。
Vaex不仅试图通过使用更多的CPU/核心和高效的C++代码来扩展,而且它的表达系统/延迟评估也采用了不同的方法。计算和操作仅在需要时执行并以块的形式执行,因此不会浪费任何内存。更有趣的是,存储了导致结果的表达式。这是vaex-ml的基础,vaex-ml是一种新的机器学习方法,其中管道成为您探索的有效工具。
结论
Vaex使用ApacheArrow数据结构和C++,在四核笔记本电脑上将串操作速度提高约30-100倍,在32核计算机上高达1000倍。几乎所有Pandas的字符串操作都受支持,并且内存使用率几乎为零,因为延迟计算是以块的形式完成的。
举报/反馈

EdgeAITech

28获赞 48粉丝
专注边缘计算和智能物联网
关注
0
0
收藏
分享