multiprocessing a geopandas.overlay()不会抛出错误,但似乎永远不会完成



我正试图将一个geopandas.overlay()传递给多处理以加快速度。我使用自定义函数和functools来部分填充函数输入,然后将迭代组件传递给函数以生成一系列数据帧,然后将它们连接成一个数据帧。

def taska(id, points, crs):
return make_break_points((vms_points[points.ID == id]).reset_index(drop=True), crs)
points_gdf = geodataframe of points with an id field
grid_gdf = geodataframe polygon grid
partialA = functools.partial(taska, points=points_gdf, crs=grid_gdf.crs)
partialA_results =[]
with Pool(cpu_count()-4) as pool:
for results in pool.map(partialA, list(points_gdf.ID.unique())):
partialA_results.append(results)
bpts_gdf = pd.concat(partialA_results)

在上面的例子中,我使用唯一值列表来子集df,并将其传递给处理器来执行函数并返回结果。最后,使用pd.concat将所有结果合并。

当我对使用numpy.array_split()创建的数据帧列表应用相同的方法时,该进程从许多处理器开始,然后它们都关闭,并且一切都挂起,没有任何迹象表明正在完成工作或它将退出。

def taskc(tracks, grid):
return gpd.overlay(tracks, grid, how='union').explode().reset_index(drop=True)

tracks_gdf = geodataframe of points with an id field
dfs = np.array_split(tracks_gdf, (cpu_count()-4))
grid_gdf = geodataframe polygon grid
partialC_results = []
partialC = functools.partial(taskc, grid=grid_gdf)
with Pool(cpu_count() - 4) as pool:
for results in pool.map(partialC, dfs):
partialC_results.append(results)
results_df = pd.concat(partialC_results)

我尝试使用get_context('spawn'). pool (cpu_count() - 4)作为池:基于这里的信息https://pythonspeed.com/articles/python-multiprocessing/行为没有变化。另外,如果我简单地运行geoandas。覆盖(tracks_gdf, grid_gdf)的过程是成功的,脚本继续到最后与预期的结果。

为什么部分函数方法在项目列表而不是数据框架列表上工作?numpy.array_split()是不是一个像列表一样的可迭代对象?如何将单个df以块形式传递到geopandas.overlay()以利用多处理功能并返回单个数据帧或一系列数据帧进行连接?

这是我的工作,但我也有兴趣,如果有一个更好的方法来执行这个和类似的任务。从本质上讲,修改了部分函数,使df分割被移动到部分函数中,然后我创建了一个来自range()的值列表作为我的行距。

def taskc(num, tracks, grid):
return gpd.overlay(np.array_split(tracks, cpu_count()-4)[num], grid, how='union').explode().reset_index(drop=True)
partialC = functools.partial(taskc, tracks=tracks_gdf, grid=grid_gdf)
dfrange = list(range(0, cpu_count() - 4))
partialC_results = []
with get_context('spawn').Pool(cpu_count() - 4) as pool:
for results in pool.map(partialC, dfrange):
partialC_results.append(results)
results_gdf = pd.concat(partialC_results)

相关内容

最新更新