正如您所说,唯一值的数量对镶木地板的大小起着非常重要的作用。
从 pandas 翻译过来,另外两个可能对 parquet 文件大小产生惊人影响的因素是:
- pandas 索引,即使它们只是自动分配的,也会默认保存;
- 数据的排序,这可能会对有时使用的游程编码镶木地板产生很大的影响。
随机分配的自动分配索引可能会占用大量空间。如果您不关心磁盘上数据的排序顺序,那么担心这一点可能会产生重大影响。
考虑一个 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