我在研究一种加快我内存密集型前端可视化应用程序的方法。我看到有些人推荐使用Apache Arrow,但是在研究时,我对Parquet和Arrow之间的区别感到困惑。
它们都是列化数据结构。最初我认为parquet是用于磁盘的,而arrow是用于内存格式的。然而,我刚刚了解到,您也可以像abc.arrow这样将arrow保存到文件中。这种情况下,它们有什么区别吗?他们不是在做同样的事情吗?
我在研究一种加快我内存密集型前端可视化应用程序的方法。我看到有些人推荐使用Apache Arrow,但是在研究时,我对Parquet和Arrow之间的区别感到困惑。
它们都是列化数据结构。最初我认为parquet是用于磁盘的,而arrow是用于内存格式的。然而,我刚刚了解到,您也可以像abc.arrow这样将arrow保存到文件中。这种情况下,它们有什么区别吗?他们不是在做同样的事情吗?
Parquet是一种用于数据序列化的列式文件格式。读取Parquet文件需要将其内容解压缩和解码成某种内存数据结构。它旨在通过牺牲解码的CPU利用率来实现空间/IO效率。它不提供任何内存计算的数据结构。Parquet是一种流式格式,必须从开头到结尾进行解码,虽然最近已经添加了一些“索引页”功能以改进存储格式,但通常随机访问操作代价较高。
另一方面,Arrow首先是一个提供列式数据结构的库,用于内存计算。当您读取Parquet文件时,可以将数据解压缩和解码成Arrow列式数据结构,以便您可以在解码后的数据上以内存方式执行分析。Arrow列式格式具有一些不错的属性:随机访问为O(1),每个值单元格都在内存中前一个和下一个之后,因此迭代效率高。
那么"Arrow文件"呢?Apache Arrow为排列一组Arrow列式数组(称为“记录批次”)定义了二进制的“序列化”协议,可用于消息传递和进程间通信。您可以将协议放在任何位置,包括磁盘上,稍后可以将其内存映射或读入内存并发送到其他位置。
Arrow协议旨在使您能够“映射”一块Arrow数据而无需进行任何反序列化,因此对磁盘上的Arrow协议数据进行分析可以使用内存映射并几乎不需要任何成本。该协议用于许多方面,例如在Spark SQL和Python之间流式传输数据,以便运行Pandas函数来处理Spark SQL数据块的这些称为“ pandas udfs ”。
在某些应用中,Parquet和Arrow可以互换地用于磁盘数据序列化。以下是需要注意的一些事项:
因此,总之,Parquet文件适用于磁盘存储,而Arrow适用于内存中(但您也可以将其放在磁盘上,然后稍后进行内存映射)。它们旨在彼此兼容并在应用程序中一起使用。
如果需要一个内存密集型的前端应用程序,我建议考虑使用Arrow JavaScript(TypeScript)库。