为具有大量字符串的数据帧加速 PyArrow Parquet 到 Pandas
Posted
技术标签:
【中文标题】为具有大量字符串的数据帧加速 PyArrow Parquet 到 Pandas【英文标题】:Speeding up PyArrow Parquet to Pandas for dataframe with lots of strings 【发布时间】:2020-09-16 06:17:19 【问题描述】:我有一个我想经常查询的 pandas DataFrame(通过 API 以 ray 形式)。我正在尝试加快它的加载速度,但是将其转换为熊猫需要大量时间(3+s)。对于我的大多数数据集,它很快,但这个不是。我的猜测是因为其中 90% 是字符串。
[742461 rows x 248 columns]
磁盘上大约有 137MB。为了消除磁盘速度的影响,我将 .parq 文件放在了 tmpfs 挂载中。
现在我已经试过了:
使用 pyArrow Parquet (read_table) 读取 parquet,然后将其转换为 pandas(立即读入 table,但使用 to_pandas 需要 3 秒) 玩弄我在 pyarrow/parquet 中能想到的几乎所有 to_pandas 设置 使用 pd.from_parquet 读取它 从 Plasma 内存存储 (https://arrow.apache.org/docs/python/plasma.html) 中读取它并转换为 pandas。同样,阅读是即时的,但 to_pandas 需要时间。 将所有字符串转换为类别关于如何在处理字符串时加快 pandas 转换,有人有什么好的建议吗?我有很多内核和内存。
我的最终结果想要成为 pandas DataFrame,因此我不受 parquet 文件格式的约束,尽管它通常是我的最爱。
问候, 尼克拉斯
【问题讨论】:
【参考方案1】:最后,我通过更仔细地处理数据来减少时间,主要是通过删除空白值,确保我们有尽可能多的 NA 值(而不是空白字符串等),并对所有文本数据进行分类,小于50% 独特的内容。
我最终通过 PyArrow 生成了模式,这样我就可以创建具有自定义索引大小(int64 而不是 int16)的分类值,这样我的类别就可以保存更多值。最终数据量减少了 50%。
【讨论】:
以上是关于为具有大量字符串的数据帧加速 PyArrow Parquet 到 Pandas的主要内容,如果未能解决你的问题,请参考以下文章
为 40 个数据帧加速 pandas concat 函数,每个数据帧有 100 万行和 100 列
Pyspark:pyarrow.lib.ArrowTypeError:需要一个整数(获取类型时间戳)
从具有大量标签的 Pandas 数据框中创建 TensorFlow 数据集?