Проблемы с получением результатов из ThreadPoolExecutor.map Python
я уже задавал вопрос в этом посте Возможно ли ускорить обработку hdf5 файла с помощью threading Python 3.6. Я продвинулся немного дальше, но теперь возникает проблема с получением результатов из map объекта: кажется, что часть данных просто куда-то теряется. Я сначала полагал, что проблема в куске:
data = np.zeros(shape=((chunkSize,) + dataShape[1:]), dtype=f[data_path].dtype)
imageNumber_variable = 0
for imageNumber_file in range(start, end):
data[imageNumber_variable,] += f[data_path][imageNumber_file,]
imageNumber_variable += 1
который нужен, чтобы ускорить выгрузку данных из файла (если делать это напрямую - f[data_path][start : start + chunk_size], то занимает в 100 раз больше времени, чем заполнение numpy.array). Поэтому я предполагаю, что проблема кроется в следующей части кода:
with ThreadFuture.ThreadPoolExecutor(max_workers=3) as executor:
tmp_return = executor.map(processing_chunk, func_arguments)
for pixel_sum in tmp_return:
intensity_total += pixel_sum
Привожу также полный скрипт:
#!/usr/bin/env python3
# coding: utf8
import h5py as h5
import numpy as np
import concurrent.futures as ThreadFuture
from itertools import product
chunk_size = 5000
def processing_chunk(file_info):
filename = file_info[0]
data_path = file_info[1]
chunk_start = file_info[2]
with h5.File(filename, 'r') as f:
dataShape = f[data_path].shape
imageCount= dataShape[0]
start = chunk_start
end = min(chunk_start + chunk_size, imageCount)
chunkSize = end - start
data = np.zeros(shape=((chunkSize,) + dataShape[1:]), dtype=f[data_path].dtype)
imageNumber_variable = 0
for imageNumber_file in range(start, end):
data[imageNumber_variable,] += f[data_path][imageNumber_file,]
imageNumber_variable += 1
pixel_sum = np.sum(data, axis=0)
return pixel_sum
def main(filename, data_path):
global length
global intensity_total
chunk_starts = np.arange(0, length, chunk_size)
func_arguments = product((filename,), (data_path,), chunk_starts)
with ThreadFuture.ThreadPoolExecutor(max_workers=3) as executor:
tmp_return = executor.map(processing_chunk, func_arguments)
for pixel_sum in tmp_return:
intensity_total += pixel_sum
if __name__ == "__main__":
filename = 'test.cxi'
data_label = '/data/data'
total_num_patterns = 0
data_file_shape = (27270, 16, 512, 128)
intensity_total = np.zeros(data_file_shape[1:])
length = 27270
total_num_patterns += length
main(filename, data_label)
f_name = 'parallel-av-num-patterns.h5'
f = h5.File(f_name, 'w')
f.create_dataset('/data/data', data=np.array([intensity_total / total_num_patterns]))
f.close()
Буду благодарен за любые замечания/предложения.