从 Dask 数据帧中获取一行而不将整个数据帧加载到内存中

Posted

技术标签:

【中文标题】从 Dask 数据帧中获取一行而不将整个数据帧加载到内存中【英文标题】:Get One Row From Dask Dataframe Without Loading Entire Dataframe into Memory 【发布时间】:2018-07-31 20:24:59 【问题描述】:

dask 是否可以一次将一行加载到内存中?我有一个巨大的 200GB 数据集,我希望 dask 在给定索引的情况下一次检索一行。然后我想从行中获取 numpy 数组。当我尝试打电话时:

df_row = df.loc[index]
df_row = df_row.values.compute()

Dask 尝试将整个 df 加载到内存中,而不仅仅是一小行。如果我不调用计算而只调用值,那么 df_row 仍然是一个 dask.array 对象。这似乎必须有一个明显的解决方案,因为它是如此常见且简单的用例。我做错了什么?

【问题讨论】:

【参考方案1】:

如果 Dask 在不加载数据的情况下可以知道每个分区中索引的开始和结束值(称为“分区”),并且分区形成单调级数,则不会加载所有行。

例如,parquet 数据类型通常在元数据中存储列的最大值/最小值,因此如果数据经过合理排序,那么.loc[] 确实只会加载包含数据的一个分区。

但是,对于 CSV 等数据格式,如果不解析和考虑所有数据,则不可能知道给定分区是否包含与请求对应的索引值。

您可能有兴趣对数据重新分区或显式设置索引,或者,如果您独立了解它们,请在尝试 .loc 操作之前提供分区的值。

【讨论】:

啊,我认为这是有道理的。假设我有一个 dask 数据框,我将其保存为 HDF5 格式。 dask 是否能够在不明确设置任何内容的情况下逐行读取它? 我不确定索引信息是否保存在 HDF5 中。你可以试试镶木地板。它仍然是逐块而不是逐行。 我会试一试镶木地板 - 非常感谢您的帮助!

以上是关于从 Dask 数据帧中获取一行而不将整个数据帧加载到内存中的主要内容,如果未能解决你的问题,请参考以下文章

从 len 18000 的 Dask 数据帧中采样 n = 2000 会产生错误 当“replace = False”时无法采用比总体更大的样本

npartitions 在 Dask 数据帧中的作用是啥?

如何从标准输入读取 dask 数据帧?

如何将多个功能应用于dask数据帧的多个块?

如何将单个镶木地板文件从 s3 读入 dask 数据帧?

从 R 中的整个数据帧中删除空格