分享

ParaText: 以2.5GB每秒的速度处理CSV文件

 自然科学思维 2016-09-14

作者:Damian Eads, June 7, 2016

 尽管在数据驱动的工作中,大多数人们都会使用分布式数据库与文件系统,但是在单机上快速读取一个文件的需求仍然坚挺地存在着。令人惊讶的是,大多数现代的文件读取器并没有利用起多核的架构,导致在高性能存储系统中大量的I/O带宽被闲置。在这里介绍的ParaText可以在单个多核机器上并行地读取文件以更有效地使用带宽。Alpha版本包含了一个并行CSV读取器。

在大约50年里,CSV一直被用做表格式数据的格式。由于CSV文件随处可见,且在实际的工作流中处理CSV文件的需求也随处可见——在这里速度,精度和容错率都是必须的指标——因而我们决定构建一个并行的CSV读取器。

我们还额外比较了ParaText7CSV读取器以及5个二进制读取器的性能。更多细节请参考我们的性能白皮书。在我们的测试中,ParaText可以以2.5GB/s的速度从一个磁盘加载一个CSV文件到内存,以及4.2GB/s的速度从内存写入外存。ParaText可以在30分钟内对一个5TBCSV文件完成解析及基于外存的计算。

为什么选CSV?

CSV的简洁性是十分诱人的。从概念上讲,CSV十分易于解析。它也是人类可读的。电子表格软件以及COBOL时期遗留的一些数据库至少可以读写CSV文件。的确,CSV被广泛用于交换表格化数据,但是不幸的是,RFC标准没有跟紧实践的步伐,导致CSV文件的扩展道路被扭曲了。CSV的格式缺少一个全世界都接受的模式,导致即使是“合适”的CSV文件也可能有模糊不清的语义,进而使每个应用对其有了不同的解释。

尽管CSV存在这样的问题,社区仍旧需要鲁棒的工具来处理CSV数据。我们开始时构建了一个迅速的,内存使用高效的,通用的多核文本读取器。我们的CSV读取器是第一个使用这一基础读取器的成果。

发布与性能的亮点

ParaText CSV读取器支持整型浮点型文本以及可分类数据类型。它总是使用最窄的比特深度来节省内存。文本域可以多行扩展。一个小型的可分类编码可以将重复的字符串映射为整数来降低内存占用率。

ParaText可以用一行代码加载一个CSV文件到Pandas DataFrame


ParaText列迭代器可以将数据填入很多种数据结构中(例如Python的字典类型,Pandas DataFrames, Dato SFrames, 或者Spark DataFrames.


在这里,expand关键字强制ParaText使用字符串来表示类别,而不是使用整型。forget可以让迭代器去释放已经被解析器访问过的列数据所占据的空间。

在我们的性能分析中,我们证明了ParaText的速度,效率,更多细节请参考性能白皮书

数据

用于我们的性能测试的文件的大小从21MB5.076TB。白皮书中描述了每个数据集的特性以及如何下载他们。


每个数据集及每种文件格式的文件大小二进制文件要比CSV文件更小。

1.ParaText是很快的!

ParaText有比其他任何在每个数据集上都测试过的CSV读取器更高的吞吐量。


什么使得一个读取器更快?一个快速的读取器可以利用存储系统的能力。四个数据集:car(6.71GB, 大量可分类数据)floats4(25.5GB, 大量浮点数) mnist8m(14.96GB, 小整数)messy2(2.1GB, 大量文本)。每个CSV加载器的吞吐展示在图中。I/O带宽黑色来表示,便于比较。遗漏的条形或者是由于崩溃,或者是错误,或者是不一致性导致。

2.ParaText内存使用很有效!

ParaText有最少的内存使用量。对Dato SFrame来说,如果数据帧存储在Dato的内核时,它就有非常低的内存使用量。Spark预留了大量的堆空间。因此很难表述它的内存使用效率,进而更好地指导如何为Spark任务准备资源。


内存有效意味着更少的崩溃情况。预估内存使用可以确保准备足够的云资源。

3.ParaText对阵二进制:仍然很快!

出色的二进制读取器可以不经任何解析,类型判断或错误检查地读取大量小型的文件。正如预料的那样,二进制读取器在比CSV10倍的二进制文件读取上超过了CSV


二进制读取器在ParaText之前完成。然而,二进制读取器处理的是更小的文件,列类型都已定义好的,并且错误处理是最少的。其中Pickle是最慢的。

然而,我们测试的二进制读取器和ParaText相比,其I/O带宽要低的多。


吞吐量问题。吞吐量能够真实反映每个方法对可用带宽的使用程度。虽然ParaText运行时间更长,但是它仍旧拥有比二进制方法高的吞吐量。H5PY(HDF5)对平行读取可能需要更好的默认值。

4.数据帧的快速转换

Spark DataFrame, Dato SFrame, ParaText都可以用一行代码将他们内部表示的数据转换为一个Python的对象。这提高了数据科学的交互体验。

这种转换是数据科学中交互体验的一个重要部分。ParaText可以在数秒内转换一个数GB的数据集,而SparkDato却需要几分钟。


交互体验?转换成一个同等的Python表达式要花费Spark DataFramesDato SFrames数分钟。

5.ParaText更加便宜!

按比例分配的Amazon Web Services(AWS)Wise ParaText的成本与其他方法相比却是不成比例地低。


成本问题。每种方法按比例分配的成本对ParaText成本的倍数。

6.ParaText接近了硬件极限!

我们定义了两个基准任务来建立CSV加载吞吐量的上界:换行符计数以及外存CSV解析。ParaText达到了非常接近由任务预估的I/O带宽的吞吐量。


有多少开销?我们对CSV文件加载,外存CSV解析,以及换行符计数与存储系统带宽做了比较。

7.ParaText是媒介数据

ParaText可以轻松处理数TB级别的数据。在我们的测试中,ParaTextSpark是仅有的能够单机成功加载并计算一个超过1TB的文件。


有TB 的数据吗?我们尝试用了每个方法来加载medium1.csv(1.015TB)

感兴趣吗?

访问GitHub并试一试ParaText吧。我们期待听到你的声音!


英文原文:http://www./tech/paratext
译者:hanhan


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多