【问题标题】:Parallelize a function with multiple inputs/outputs geodataframe-variables并行化具有多个输入/输出地理数据框变量的函数
【发布时间】:2021-09-20 12:53:38
【问题描述】:

使用以前的答案 (merci Booboo), 代码思路是:

from multiprocessing import Pool

def worker_1(x, y, z):
    ...
    t = zip(list_of_Polygon,list_of_Point,column_Point)
return t

def collected_result(t):
    x, y, z = t # unpack
    save_shp("polys.shp",x)
    save_shp("point.shp",y,z)

if __name__ == '__main__':

gg = gpd.read_file("name.shp")
pool = Pool()
for index, pol in gg.iterrows():
    xlon ,ylat = gg.centroid
    result = pool.starmap(worker_1, zip(pol,xlon,ylat))
    # or
    # result = mp.Process(worker_1,args = (pol,xlon,ylat))
    pool.close()
    pool.join()  

collected_result(result)

但是地理数据框 (Polygon,Point) 是不可迭代的,所以我不能使用池,有什么并行化的建议吗?

如何压缩worker_1中的(geodataframe)输出然后独立保存(或shapefile中的多个层),使用全局参数更好? ...因为 zip 只保存列表(对*)?

【问题讨论】:

  • 这个不清楚。首先你在worker_1 中有一个缩进问题,其次,如果你使用mapworker_1 将收到一个参数。三、MultiPolygon是什么?这是一个对所有latlon 值重复使用的对象吗? collected_result 在这个问题上做了什么? MultiPolygon 是某种集合吗?请用更正和解释更新您的问题。
  • 告诉我MultiPolygon 是什么。请参阅我之前的评论。
  • @Booboo 理论上是进入多个shapefile,找到里面的多边形,然后在worker_1中做一些计算,输出为多边形和具有一定特征的点(在worker_1中计算)。理论上 collect_result 应该重新组合所有输出而不重复。例如一个 shapefile 有 1000 个多边形,每个多边形都去一个处理器进行计算并将它们保存在收集中
  • 我想我的问题是,对于所有 xy 值,是否要将相同的 MultiPolygon 对象传递给 worker_
  • 不,这是一种说法,有很多输入多边形,但 shapefile 中的大多数多边形都不是多边形...所以 shapefile 中的每个多边形都经过 worker_1 我修改代码以使更清晰

标签: python parallel-processing geopandas pool shapely


【解决方案1】:

好吧,如果我了解您要做什么,也许以下就是您需要的。在这里,我正在构建 args 列表,该列表将用作 starmapiterable 参数,方法是迭代 gg.iterrows()(无需使用 zip):

from multiprocessing import Pool

def worker_1(pol, xlon, ylat):
    ...
    t = zip(list_of_Polygon, list_of_Point, column_Point)
    return t

def collected_result(t):
    x, y, z = t # unpack
    save_shp("polys.shp", x)
    save_shp("point.shp", y, z)

if __name__ == '__main__':

    gg = gpd.read_file("name.shp")
    pool = Pool()
    args = []
    for index, pol in gg.iterrows():
        xlon, ylat = gg.centroid
        args.append((pol, xlon, ylat))
    result = pool.starmap(worker_1, args)
    pool.close()
    pool.join()      
    collected_result(result)

您正在创建一个 Pool 实例,并在循环中重复调用方法 starmapclosejoin。但是一旦你在Pool 实例上调用close,你就不能再向池提交任何任务(即再次调用starmap),所以我认为你的循环/缩进都是错误的。

【讨论】:

  • 好的,我会改正的......谢谢 booboo ^^ PD:我希望我不要再得到多边形它是不可迭代的,
  • 我只是想确保我的回答正确地解决了您的问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-26
  • 2021-12-07
  • 2021-08-07
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多