我想尝试将许多无法立即放入内存的大型 Pandas DataFrame 保存到单个 Parquet 文件中。我们希望在磁盘上有一个大的 parquet 文件,以便从那个大文件中快速获取我们需要的列。
具体来说,我们有大约 200 个小型 parquet 文件,每个文件有大约 100 列(基因)和 200 万行(单元格)。磁盘上的每个 parquet 都非常小,大约 40MB,所有大约 200 个 Parquet 文件的总数约为 8GB。数据非常稀疏(>90% 的值为零),Parquet 可以很好地将磁盘上的数据压缩到较小的大小。
由于数据集是稀疏的,我们可以使用 Pandas/Scipy 稀疏数组将所有约 25,000 个基因(列)和 200 万行(单元格)加载到单个稀疏数据结构中。但是,我们不能将 SparseDataFrame 直接写入 Parquet(参见 Github 问题https://github.com/pandas-dev/pandas/issues/26378),将整个矩阵转换为密集矩阵会导致内存不足(例如2,000 列/基因和 200 万行/细胞的密集阵列占用 30GB 的 RAM)。这会阻止我们生成我们想要的单个大型 Parquet 文件。
Peter Hoffmann 的演示文稿(https://youtu.be/fcPzcooWrIY?t=987 at 16min 20second)提到您可以将数据流式传输到 Parquet 文件(保留有关元数据的记录),而无需将所有数据保存在内存中。是否可以将列/行流式传输到镶木地板文件中?我找不到使用 Pandas 的示例。PyArrow 或 FastParquet 支持这个吗?