任何数据分析工作流程中的第一个任务就是简单地读取数据,这绝对必须快速有效地完成,这样才能开始更有趣的工作。在许多行业和领域,CSV文件格式是存储和共享表格数据的王道。快速可靠地加载CSV至关重要,它必须能够很好地扩展到各种文件大小、数据类型和形状。这篇文章比较了在三个不同的CSV解析器上读取8个不同的真实世界数据集的性能:R的Fread、Pandas的Read_CSV和Julia的CSV.jl。每一个解析器分别被选为R、Python和Julia的“同类最佳”CSV解析器。
这三个工具都强大地支持加载各种可能缺少值的数据类型,但只有Fread(R)和CSV.jl(Julia)支持多线程-Pandas只支持单线程CSV加载。Julia的CSV.jl还有一个独特之处,那就是它是唯一一个完全用高级语言实现的工具,而不是用C实现的,并且是从R/Python包装而来的。(Pandas确实有一个功能稍强的Python原生解析器,它的速度要慢得多,而且几乎所有READ_CSV的使用都默认使用Cengine。)。因此,这里的CSV.jl基准测试不仅表示在Julia中加载数据的速度,而且还指示在分析中使用的后续Julia代码中可能出现的各种性能。
以下基准测试显示,即使在单核上,Julia的CSV.jl也比Pandas快1.5到5倍;在启用多线程的情况下,它与R的Read_CSV一样快,甚至更快。用于基准测试的工具有针对Julia的BenchmarkTools.jl、针对R的MicroBenchmarkmark和针对Python的timeit。
让我们从一些同类数据集开始,即在所有列中都具有相同类型数据的数据集。本节中的数据集partfrom股价数据集派生自此基准站点。性能指标是线程数量从1增加到20时加载数据集所花费的时间。由于Pandas不支持多线程,因此所有内核计数都会全面报告单线程速度。
统一浮点数据集:第一个数据集包含以100万行和20列排列的浮点值。熊猫加载这个文件需要232毫秒。单线程data.table比CSV.jl快1.6倍。使用多线程时,CSV.jl表现最好,速度是data.table的两倍多。在没有多线程的情况下,CSV.jl比Pandas快1.5倍,而在多线程的情况下,CSV.jl的速度大约是Pandas的11倍。
统一字符串数据集(I):此数据集包含所有列中的字符串值,具有100万行和20列。熊猫需要546毫秒来加载文件。对于R,添加线程似乎不会带来任何性能提升。单线程CSV.jl比data.table快2.5倍。在10个线程的情况下,它大约比data.table快14倍。
均匀字符串数据集(II):此数据集的维度与上一数据集的维度相同。但是,每列也都有缺失值。熊猫需要300毫秒。在没有线程的情况下,CSV.jl比R快1.2倍,有线程时大约快5倍。
此数据集包含5,000万行和5列,大小为2.5 GB。AAPL股票有开盘价、高价、低价和收盘价。包含价格的四列是浮点值,还有一个日期列。
单线程CSV.jl大约比R的Fread from mdata.table快1.5倍。在多线程的情况下,CSV.jl大约快22倍!熊猫的Read_CSV阅读需要34秒,比R和Julia都慢。
混合数据集:此数据集有10k行和200列。列包含、字符串、浮点数、日期时间和缺失值。Pand需要大约400毫秒来加载此数据集。在没有线程的情况下,CSV.jl的速度是R的2倍,10线程的速度大约是R的10倍。
现在,让我们看看更广泛的数据集。Kaggle的这个抵押贷款风险数据集是一个混合类型的数据集,有356k行和2190列,列是异构的,具有String、Int、Float和Missing类型的值。熊猫需要119秒才能读入这个数据集。单线程Fread大约比CSV.jl快两倍。然而,在线程更多的情况下,Julia要么和R一样快,要么稍微快一点。
宽数据集:这是一个相当宽的数据集,有1000行和20,000列。数据集包含字符串和Int值。Pandasta读取数据集需要7.3秒。在这种情况下,单个theradeddata.table大约比CSV.jl快5倍。由于线程更多,CSV.jl与data.table竞争。在使用data.table的情况下,增加线程数量似乎不会带来任何性能提升。
Fannie Mae收购数据集:该数据集可以从Fannie Mae网站下载,该数据集有400万行和25列,值类型为Int、String、Float和Missing。
单线程data.table比CSV.jl快1.25倍。但是,CSV.jl的性能随着线程的增多而不断提高。使用多线程时,CSV.jl的速度大约是原来的4倍。
在所有8个数据集中,Julia的CSV.jl总是比Pandas快,并且在多线程的情况下,它与R的data.table竞争。
系统信息:执行基准测试的系统规格如下
$uname-aLinux南极5.6.0-CUSTOM+#1 SMP Mon Apr 6 00:47:33 EDT 2020 x86_64 GNU/Linux。
$lscpuArchitecture:x86_64CPU操作模式:32位,64位字节顺序:小端CPU:40个在线CPU列表:0-39个每核线程数:2个每插槽核数:10个插槽:2个NUMA节点:2个供应商ID:GenuineIntelCPU系列:6型号:85型号:85型号:英特尔(R)至强(R)银色4114 [email protected]步进:4CPU MHz:800.225 CPU最大MHz:300000 CPU min MHz:800.0000BogoMIPS:440000虚拟化:VT-xL1d高速缓存:32KL1高速缓存:1024KL3高速缓存:14080Knode0 CPU(秒):0-100.25CPU MHz:3000.0000CPU min MHz:800.0000BogoMIPS:440000虚拟化:VT-xL1d高速缓存:32KL1高速缓存:1024KL3高速缓存:14080Knode0 CPU(秒):0-100.25CPU MHz:300000 CPU MIPS:440000虚拟化:VT-xL1d高速缓存:32KL1高速缓存:1024KL3高速缓存:14080Knode0 CPU。9,20-29个NUMA节点1个CPU:10-19,30-39。
$free-h可用的可用空闲共享缓冲区/缓存总数内存:62G 3.3G 6.3G 352K 52G 58G斯瓦普:59G 3.2G 56G