Получение выходных данных из функции в многопроцессорном пуле, который использует генератор - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь извлечь стратифицированные случайные выборки из большого файла TIF, используя numpy. Поскольку размер файла велик, требуется много памяти для его одновременного чтения в памяти. Я использую генератор, чтобы прочитать его кусками. И я нашел способ использовать генератор (псевдо), ограничивая максимальный размер очереди (как предложено в этом посте: Многопроцессорная обработка Python с генератором )

Но проблема в том, что рабочая функция возвращает словарь значений. Я не могу понять, как вернуть значения из рабочей функции обратно в основной процесс и получить список словарей.

Вот мой соответствующий код:

import multiprocessing as mp

def process_worker(args):

    tile_id, levels, tie_pt, tile_arr, pixel_size, nsamp = args

    level_dict = get_coords(levels, tie_pt, tile_arr,   ##function separately written
                            pixel_size, nsamp, 
                            pixel_center=True)

    if len(level_dict) > 0:
        q_out.put(level_dict)


if __name__ == '__main__':

    infile = "large_file.tif"

    nsamp = 100
    nprocs = 4

    levels = range(0, 100, 1)

    q_in = mp.Queue(maxsize=nprocs)
    q_out = mp.Queue()

    pool = mp.Pool(nprocs, initializer=process_worker, initargs=(q_in,))

    raster = Raster(infile)  ## class separately written
    pixel_size = raster.pixel_size

    tile_count = 1

    for tie_pt, tile_arr in raster.get_next_tile():  ## generator to get file chunks as top left coordinate and numpy array

        tile_coords = get_bounds(tie_pt, tile_arr)  ## separately written function

        q_in.put((tile_count, levels, tie_pt, tile_arr, pixel_size, nsamp))

        tile_count += 1


    pool.close()

    results = q_out.get()  ## this should be a list of dictionaries
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...