Я пытаюсь извлечь стратифицированные случайные выборки из большого файла 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