dask是否可以一次将一行加载到内存中?我有一个庞大的200GB数据集,我希望dask一次获得一个索引就可以检索一行。然后我想从行中获取numpy数组。当我尝试致电时:
df_row = df.loc[index]
df_row = df_row.values.compute()
Dask尝试将整个df加载到内存中,而不只是一小行。如果我不调用compute而仅调用值,则df_row仍然是dask.array对象。这似乎必须有一个显而易见的解决方案,因为它是一个如此常见且简单的用例。我在做什么错了?
答案 0 :(得分:1)
如果Dask在不加载数据的情况下可以知道每个分区的索引的开始和结束值(称为“分区”),并且不会形成单调级数,则不会加载所有行。
例如,镶木地板数据类型通常在元数据中存储列的最大值/最小值,因此,如果对数据进行了合理的排序,那么.loc[]
实际上只会加载包含该数据的一个分区。
但是,对于诸如CSV这样的数据格式,不可能在不解析和考虑所有数据的情况下就知道给定分区是否包含与请求相对应的索引值。
您可能希望对数据进行重新分区或显式设置索引,或者,如果您独立地知道它们,则可以在尝试.loc
操作之前提供划分的值。