我正在寻找一种加快应用程序内存密集型前端的方法。我看到有人推荐Apache Arrow,但在研究它的同时,我对Parquet和Arrow之间的区别感到困惑。
它们都是列化数据结构。最初,我认为镶木地板用于磁盘,而箭头则用于内存格式。但是,我刚刚了解到,您也可以将箭头保存到桌面上的文件中,例如abc.arrow。在这种情况下,有什么区别?他们不是在做同一件事吗?
答案 0 :(得分:8)
Parquet是用于数据序列化的列式文件格式。读取Parquet文件需要将其内容解压缩并解码为某种内存数据结构。它被设计为空间/ IO高效的,但会消耗用于解码的CPU利用率。它不提供任何用于内存计算的数据结构。 Parquet是一种流格式,必须从头到尾进行解码,而最近在存储格式中添加了一些“索引页”功能,通常,随机访问操作成本很高。
另一方面,箭头首先是为内存计算提供列数据结构的库。读取Parquet文件时,可以将数据解压缩并解码为 Arrow列数据结构,以便随后可以对解码后的数据进行内存内分析。箭头柱状格式具有一些不错的属性:随机访问为O(1),并且每个值单元格在内存中的前一个和后一个相邻,因此迭代有效。
那“箭头文件”呢? Apache Arrow定义了一种二进制“序列化”协议,用于安排Arrow列数组的集合(称为“记录批处理”),该数组可用于消息传递和进程间通信。您可以将协议放在任何地方,包括磁盘上,以后可以对其进行内存映射或读入内存并发送到其他地方。
此Arrow协议的设计目的是使您可以“映射”一个Arrow数据块而无需进行任何反序列化,因此对磁盘上的Arrow协议数据执行分析可以使用内存映射并有效地支付零成本。该协议用于许多用途,例如Spark SQL和Python之间的流数据,用于针对Spark SQL数据块运行pandas函数,这些被称为“ pandas udfs”。
在某些应用程序中,Parquet和Arrow可以互换使用,以进行磁盘数据序列化。注意事项:
因此,总而言之,Parquet文件是为磁盘存储而设计的,Arrow是为内存而设计的(但是您可以将其放在磁盘上,然后再进行内存映射)。它们旨在相互兼容,并在应用程序中一起使用。
对于内存密集型的前端应用程序,我建议您看一下Arrow JavaScript(TypeScript)库。