我正在尝试通过dbscan
处理大量数据,并希望利用机器上可用的所有核心来加速计算。我正在使用自定义距离度量,但是距离矩阵没有预先计算。
我尝试了许多不同的实现,但并没有取得很大的成功。我在下面列出了它们,并跟踪了终端窗口中的性能表现。
- 使用内置的
n_jobs
输入:
model = DBSCAN(eps=eps, min_samples=min_samps,metric=distance_sphere_and_time, n_jobs=-1)
model.fit(X)
CPU仅使用了2%。看起来只有48个可能的核心中的一个被包含在计算中。
- 使用内置的
n_jobs
输入以及算法Brute
。
model = DBSCAN(eps=eps, min_samples=min_samps,metric=distance_sphere_and_time, algorithm=`Brute`, n_jobs=-1)
model.fit(X)
在这里建议使用dbscan进行并行处理的唯一方法是:https://github.com/scikit-learn/scikit-learn/pull/8039。尽管有警告,但
Brute
可能会使它变慢。CPU使用率达到了100%,但速度并没有更快。3. 使用dask进行并行处理。
client = Client(processes=False, n_workers=8)
model = DBSCAN(eps=eps, min_samples=min_samps,metric=distance_sphere_and_time)
with parallel_backend('dask'):
model.fit(X)
在这里建议采用的实现方式是:https://github.com/dask/dask-tutorial/issues/80。然而,CPU 利用率仍然保持在 2%,表明只使用了一个核心。
非常感谢任何建议。
Client
中删除输入并在DBSCAN中添加n_jobs=-1
来增加了CPU利用率。我无法让它使用所有可用的核心,但确实将CPU使用率提高到了约35%。client = Client()
model = DBSCAN(eps=eps, min_samples=min_samps, metric=distance_sphere_and_time, n_jobs=-1)
- Lauren K