1

我将两个不同的 pandas DataFrames 存储为镶木地板文件(通过kedro)。

float32两个 DataFrame在写入磁盘之前具有相同的尺寸和 dtypes ( )。此外,它们在 RAM 中的内存消耗是相同的:

distances_1.memory_usage(deep=True).sum()/1e9
# 3.730033604
distances_2.memory_usage(deep=True).sum()/1e9
# 3.730033604

当作为.parquet文件持久化时,第一个 df 生成一个 ~0.89GB 的文件,第二个文件生成一个 ~4.5GB 的文件。

distances_1有更多的冗余值distances_2,因此压缩可能更有效。

将 parquet 文件从磁盘加载到 DataFrames 会产生与原始 DataFrames 相同的有效数据。

  • 如何解释文件之间的巨大差异?
  • 出于什么原因,第二个文件可能比内存中的数据结构大?
4

2 回答 2

2

正如您所说,唯一值的数量对镶木地板的大小起着非常重要的作用。

从 pandas 翻译过来,另外两个可能对 parquet 文件大小产生惊人影响的因素是:

  1. pandas 索引,即使它们只是自动分配的,也会默认保存;
  2. 数据的排序,这可能会对有时使用的游程编码镶木地板产生很大的影响。

随机分配的自动分配索引可能会占用大量空间。如果您不关心磁盘上数据的排序顺序,那么担心这一点可能会产生重大影响。

考虑一个 pandas 框架的四种情况,其中一列在所有情况下都包含相同的数据:前 2**16 个整数的圆角正方形。在没有索引的情况下以排序形式存储它需要 2.9K;没有自动分配索引的 shuffle 需要 66K;自动分配索引然后改组需要 475K。

import pandas as pd
import numpy as np
!mkdir -p /tmp/parquet
d = pd.DataFrame({"A": np.floor(np.sqrt(np.arange(2**16)))})

d.to_parquet("/tmp/parquet/straight.parquet")
d.to_parquet("/tmp/parquet/straight_no_index.parquet", index = False)
d.sample(frac = 1).to_parquet("/tmp/parquet/shuf.parquet")
d.sample(frac = 1).to_parquet("/tmp/parquet/shuf_no_index.parquet", index = False)
ls -lSh /tmp/parquet
-rw-r--r--  1 user  wheel   475K Mar 18 13:39 shuf.parquet
-rw-r--r--  1 user  wheel    66K Mar 18 13:39 shuf_no_index.parquet
-rw-r--r--  1 user  wheel   3.3K Mar 18 13:39 straight.parquet
-rw-r--r--  1 user  wheel   2.9K Mar 18 13:39 straight_no_index.parquet
于 2021-03-18T17:50:00.890 回答
1

从 Kedro 的角度来看,这只是调用了此处write_table记录的 PyArrow 库函数。目录定义中的参数可以使用这些参数中的任何一个,并且可能值得一试?save_args

于 2021-03-16T10:04:51.563 回答