我正在寻找一种方法来加速我的内存密集型前端 vis 应用程序。我看到有人推荐 Apache Arrow,而我正在研究它,我对 Parquet 和 Arrow 之间的区别感到困惑。
它们都是列式数据结构。最初我认为 parquet 是用于磁盘的,而箭头是用于内存格式的。但是,我刚刚了解到你也可以将箭头保存到办公桌上的文件中,比如 abc.arrow 那样的话,有什么区别呢?他们不是在做同样的事情吗?
我正在寻找一种方法来加速我的内存密集型前端 vis 应用程序。我看到有人推荐 Apache Arrow,而我正在研究它,我对 Parquet 和 Arrow 之间的区别感到困惑。
它们都是列式数据结构。最初我认为 parquet 是用于磁盘的,而箭头是用于内存格式的。但是,我刚刚了解到你也可以将箭头保存到办公桌上的文件中,比如 abc.arrow 那样的话,有什么区别呢?他们不是在做同样的事情吗?
Parquet 是一种用于数据序列化的列文件格式。读取 Parquet 文件需要将其内容解压缩并解码为某种内存数据结构。它被设计为节省空间/IO,但代价是 CPU 用于解码。它不提供任何用于内存计算的数据结构。Parquet 是一种流格式,必须从头到尾进行解码,而最近在存储格式中添加了一些“索引页面”设施,通常随机访问操作成本很高。
另一方面,Arrow 首先是一个为内存计算提供列数据结构的库。当您读取 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) 库。