Polars和Pandas DataFrame占用的内存几乎一样,Polars的优势在哪里?

niknxzdl  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(148)

我想比较相同数据集的内存消耗。我从Oracle数据库中使用pandas和polars读取相同的SQL查询。内存使用结果几乎相同。执行时间比polars快2倍。我希望polars将更有效地利用内存。
有没有人能解释一下?有没有什么建议可以减少相同数据集的内存使用量?
Polars Read SQL:node001x
Pandas Read SQL:

结果(polars)和数据(pandas)形状:



最后是内存使用:


c3frrgcw

c3frrgcw1#

polars的内存效率声明不是关于静态数据,而是关于对数据执行操作的内存开销。
Here's a good demo of that
截图:x1c 0d1x
您可以看到,在左侧,Polars需要大约2秒,并且内存使用量略有增加(可能是~5%)。在右边,pandas需要大约40秒,需要大约20%的系统内存。polars更快的原因是双重的。正如你所看到的,在polars方面,所有的CPU线程都将达到100%,但在pandas方面,每次只有1个线程,而且它们甚至没有持续。第二个原因是内存效率低下意味着它不必要地复制,这很慢。

速度提高20倍,内存使用量是pandas的25%。

顺便说一下问题中提到的速度差异。polars本身并不读取数据库,它使用connectorx库,该库使用一些优化,通过创建块并并行获取这些块来更快地加载数据。您可以在这里阅读有关内容。如果数据库后端无法更快地处理执行查询,那么尝试以块的方式执行查询可能会比让查询作为单个查询发生更慢。调用。此外,如前所述,数据库查询是先用polars,然后用pandas after 完成的。数据库通常会缓存结果,所以如果你连续运行同一个查询两次,第二次会更快,不管是哪个第三方库进行查询。

4nkexdtk

4nkexdtk2#

Polars的一大优势是查询优化
如果您使用read_database将所有数据加载到内存中,并且仅执行此操作,则不会有任何差异
另一方面,如果你让你读到的数组为lazy(DataFrame.lazy),然后执行一些其他的操作,然后收集结果(LazyFrame.collect),那么这就是Polars的亮点所在
注意:通常你会想直接延迟读取数据(例如scan_parquet而不是read_parquet),但是对于read_database,没有scan_等价物

相关问题