有没有办法获取大于可用内存的 dask 数组的唯一行?理想情况下,不将其转换为 dask DataFrame?
我目前使用这种方法
import dask.array as da
import dask.dataframe as dd
dx = da.random.random((10000, 10000), chunks=(1000, 1000))
ddf = dd.from_dask_array(dx)
ddf = ddf.drop_duplicates()
dx = ddf.to_dask_array(lengths=True)
Run Code Online (Sandbox Code Playgroud)
它适用于更大的数据集,np.unique(dx, axis=0)但最终也会耗尽内存。
我使用的是 Python 3.6(但可以升级)、Dask 0.20 和 Ubuntu 18.04 LTS。
你总是可以使用numpy.unique:
import dask.array as da
import numpy as np
dx = da.random.random((10000, 10000), chunks=(1000, 1000))
dx = np.unique(dx, axis=0)
Run Code Online (Sandbox Code Playgroud)
当您尝试将其与“大于我的 RAM 的数据集”一起使用时,这可能仍然会给您带来内存问题,因为它将在单个节点上运行计算。有一个dask.array.unique函数,但还不支持axis关键字。这意味着它将展平数组并返回唯一的单个值,而不是唯一的行。允许任何类型的手动并行版本的排序功能似乎dask.array都没有实现。
我的建议是暂时忍住并转换为dask.dataframe. 这种方法可以确保您获得正确的输出,即使它不是可以想象的最快的实现。
我最初认为可能有一个简单的 hack 可用于实现 的axis参数dask.array.unique。然而,由于块的存在,用于实现其自己的关键字的blob 类型技巧numpy.unqiueaxis结果并不容易转移到 Dask 数组。
所以目前没有聪明的解决方法。只需使用dask.dataframe.