在多处理中使用共享数组

时间:2019-05-23 07:55:26

标签: python multithreading ray

我试图在python中运行并行进程,其中我必须根据某些条件从大型数组中提取某些多边形。大数组具有索引的10k +多边形。

extract_polygon函数中,我通过了(数组,索引)。基于索引,函数必须返回与该索引相对应的面,或者不基于定义的条件返回面。该数组从不更改,仅用于根据提供的索引读取多边形。

由于数组很大,因此在并行处理期间遇到内存不足错误。我该如何避免呢? (以某种方式,如何在多处理中有效使用共享数组?)

下面是我的示例代码:

def extract_polygon(array, index):

    try:
        islays = ndimage.find_objects(clone==index)
        poly = clone[islays[0][0],islays[0][1]]
        area = np.count_nonzero(ploy)        

        minArea = 100
        maxArea = 10000

        if (area > minArea) and (area < maxArea):
            return poly
        else:
            return None

    except:
        return None

start = time.time()
pool = mp.Pool(10)
results = pool.starmap(get_objects,[(array, index) for index in indices])
pool.close()
pool.join()

#indices here is a list of all the indexes we have. 

在这种情况下,我可以使用其他任何库,例如ray吗?

1 个答案:

答案 0 :(得分:0)

您绝对可以使用Ray之类的库。

结构看起来像这样(简化了您的应用程序逻辑)。

import numpy as np
import ray

ray.init()

# Create the array and store it in shared memory once.
array = np.ones(10**6)
array_id = ray.put(array)


@ray.remote
def extract_polygon(array, index):
    # Change this to actual extract the polygon.
    return index

# Start 10 tasks that each take in the ID of the array in shared memory.
# These tasks execute in parallel (assuming there are enough CPU resources).
result_ids = [extract_polygon.remote(array_id, i) for i in range(10)]

# Fetch the results.
results = ray.get(result_ids)

您可以在documentation中了解有关Ray的更多信息。

请参阅以下一些相关答案: