为什么读取镶木地板数据集需要比数据集大小更多的内存?

2024-01-02

我正在尝试使用 pyarrow 从 Python 中的 S3 读取镶木地板数据集。 S3 UI 显示该路径的大小为 14.3 GB,总共 836 个对象。我在具有 64GB RAM 的 c4.8xlarge EC2 实例上运行代码。尽管 RAM 是数据集大小的 4 倍多,但我的机器内存不足并且程序崩溃。

为什么读取这个数据集需要这么多内存?有办法避免这个问题吗?我知道像 Spark 和 Dask 这样的分布式计算库,并且能够在 PySpark 中很好地使用这个数据集,但我正在尝试建立一个单机工作流程。

这是我用来读取数据集的代码:

import pyarrow.parquet as pq
from pyarrow import fs
s3 = fs.S3FileSystem()


#fs = s3fs.S3FileSystem()
bucket = "<bucket_name>"
path = "<path>"

dataset = pq.ParquetDataset(f"{bucket}/{path}", filesystem=s3)

这是架构的摘要和一些统计数据。我正在读取 113 列中的 9 列,共有 7,045,204 行:

Column 1: int
Column 2: Array<int>, average len around 450
Column 3: Array<int>, average len around 450
Column 4: Array<int>, average len around 1000
Column 5: Array<int>, average len around 1000
Column 6: String, average len of 2
Column 7: int
Column 8: int
Column 9: timestamp

“为什么加载的镶木地板比磁盘上的大”这个问题的答案是压缩,正如 @michael-delgado 在评论中解释的那样。

针对您的情况的解决方法是通过以下任一方式使用 Arrow dataset apipyarrow.dataset.dataset或通过设置use_legacy_dataset=False如果你想使用 ParquetDataset。更详细的信息here https://arrow.apache.org/docs/python/parquet.html#reading-from-partitioned-datasets

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么读取镶木地板数据集需要比数据集大小更多的内存? 的相关文章

随机推荐