1.Parquet格式介绍
这是一种分布式的存储方式,最开始接触到,是为了解决大量的行情数据存储问题,如何在python语言下,何种存储结构,既可以节省磁盘空间,同时读写速度又很快
最开始找到的存储格式为hdfs,它既可以压缩存储,而且读取速度也很快,但是在pandas提供的方法下,有一个很难受的bug,当覆盖数据集中某个key的数据,被覆盖的数据的磁盘空间并不会被释放,也就是你不断覆盖某个key的数据,在磁盘中该文件的占用大小会越来越大
后来终于找到,pd.to_parquet的存储方式,它同样支持压缩存储,同时读写速度也是非常优秀。而且它可以只读取指定列的数据,其存储方式简直和pd.DataFrame就是绝配
之后本人绝大部分行情数据都存储成parquet格式,但现在,生产环境是C++,如何能让C++程序也能读取parquet文件呢?
经过一番搜索,终于找到一个csdn的小程序,提供了已经编译好的lib文件和dll文件,在release模式下能正常跑通,但是!在debug模式下读取文件报错了!!应该是需要debug模式下编译生成的dll,那没办法只能自己去编译apache arrow
2.Apache Arrow下载
Apache Arrow源码下载地址: https://dlcdn.apache.org/arrow/
从以上网址,选择对应版本的Apache Arrow进行下载
本人下载是目前最新的稳定版本10.0.0
3.Apache Arrow编译
Apache Arrow编译指导网址:https://arrow.apache.org/docs/developers/cpp/building.html
本人主要根据以上网站的指导,完整的整个编译过程。
大部分的Linux系统是自带cmake工具的,但是windows系统并没有,需要下载安装,下载地址如下
本人直接下载cmake的windows压缩包,下载之后直接解压就可以使用
为了方便使用,也可以将cmake下的bin路径添加到系统的环境变量
之后在cmd命令行输入cmake,看到如下信息,就是cmake已经配置完成了
将Apache Arrow源码下载,解压缩到本地之后,可以看到如下目录,本次的主角当然是cpp文件目录,这是我们需要编译的路径
为了把编译的文件单独放在一个文件夹下,需要新建一个build文件夹,这个文件夹在哪里都无所谓,本次就新建在apache-arrow-10.0.0的同级路径下
打开cmd,在cmd中输入
cd /d E:\program\vs\arrow
其中E:\program\vs\arrow是apache-arrow-10.0.0所在路径
然后新建文件夹build,并进入build文件夹
mkdir build
cd build
接下来输入cmake命令进行编译
cmake ..\apache-arrow-10.0.0\cpp
-A x64
-DCMAKE_BUILD_TYPE=DEBUG
-DARROW_PARQUET=ON
-DARROW_OPTIONAL_INSTALL=ON
-DARROW_WITH_ZLIB=ON
-DBOOST_ROOT=E:/program/vs/arrow/boost/boost_1_69_0
-DBOOST_LIBRARYDIR=E:/program/vs/arrow/boost/lib
其中
…\apache-arrow-10.0.0\cpp 这个路径指向的是之前的那个cpp文件夹,这里也可以使用绝对路径
-A x64 这里是指定使用x64平台
-DCMAKE_BUILD_TYPE=DEBUG 这是指定使用debug模式编译,本次目的主要是编译debug下的dll文件
-DARROW_PARQUET=ON 这个选项是需要编译parquet组件,本次主要是需要编译生成parquet的dll
-DARROW_OPTIONAL_INSTALL=ON 这个选项是只安装目标选项的安装
-DARROW_WITH_ZLIB=ON 这个选项是需要安装zlib功能,python那边输出文件的时候使用的是gzip压缩,故需要安装该功能,不然也无法读取文件
-DBOOST_ROOT=E:/program/vs/arrow/boost/boost_1_69_0 这个选项是执行boost库的路径,由于编译需要使用到boost库
-DBOOST_LIBRARYDIR=E:/program/vs/arrow/boost/lib 这个选项是执行boost库的lib文件路径,在之前已经编译好了boost库,如果没加这选项,该项目貌似也会去编译需要的boost库文件
特别注意:boost的路径必须是/而不能是windows路径的\,不然之后编译会报错!!!
执行完成之后会在build文件夹下产生如下文件,使用vs打开arrow.sln,官网建议是使用vs2017及以上版本,本次使用vs2017
打开vs之后界面如下,首先需要查看下是否是debug模式,以及平台是否是x64,确认无误之后再ALL BUILD单击右键生成,这时候就开始漫长的生成过程
最后生成完成后,发现还有一些项目生成失败,这时候不要急
在输出界面往上翻,找出错误的原因,在这步失败的主要原因基本上是编译过程第三方库需要从github下载,在国内因为限制,很有可能就下载失败了,所以导致第三方库没法编译安装
所以这时候只需要关注要下载什么文件,需要放在哪里这两个问题
上图展示了输出界面显示的其中一处错误,分别告诉我们文件从哪里下载,文件要放在哪里,至于输出界面里的“无法打开包括文件”这类错误都是因为没编译第三方库导致的,不用去管
手动下载完对应的文件,并放置到正确的位置之后,再次编译生成
注意:不仅路径要放对,文件名也得对
看到以下结果,就说明编译成功了
然后进入build/debug/Debug文件夹下,已经生成了我们需要的arrow.lib、arrow.dll、parquet.lib以及parquet.dll
使用apache arrow10.0.0版本的lib以及dll,需要使用std:c++17标准
具体地,在vs下需要去项目属性 -> 配置属性 -> C/C++ ->语言 -> C++语言标准中选择std:c++17
至此就在windows下使用C++调用对应的lib去读取parquet文件了
关注【量化杂货铺】公众号,在后台回复【parquet】,就可以获得使用C++读取parquet的测试程序包,里面含有编译好的lib以及dll