Целью является обработка изображений на видеокадрах. Видео можно разделить на 16 отдельных регионов, на которых можно выполнить обработку. Поэтому для выполнения обработки одновременно используются 16 различных процессов (результат также сохраняется для каждого региона).Python: распространение видеокадров по нескольким процессам
import cv2
import multiprocessing
def process_region(n):
cap = cv2.VideoCapture('/path/to/video.avi')
ret, frame = cap.read()
while ret:
# crop frame to region n
# process the region
ret, frame = cap.read()
pool = multiprocessing.Pool()
pool.map(process_region, range(16))
Очевидным недостатком является то, что все процессы загружают видео отдельно. Тестирование действительно показывает, что производительность чтения тестового видео действительно идет вниз после определенного (10) числа процессов:
+------------+--------+
| #processes | T (s.) |
+------------+--------+
| 1 | 30.2 |
| 2 | 27.1 |
| 3 | 32.9 |
| 4 | 30.2 |
| 5 | 31.7 |
| 6 | 29.6 |
| 7 | 29.5 |
| 8 | 29.5 |
| 9 | 30.6 |
| 10 | 30.9 |
| 11 | 32.4 |
| 12 | 35.7 |
| 13 | 40.3 |
| 14 | 43.5 |
| 15 | 48.3 |
| 16 | 52.5 |
+------------+--------+
Я попытался, используя только один процесс, чтобы прочитать все видеокадры и отправить его с multiprocessing.Pipe
до 16 начала multiprocessing.Process
процессов. Однако это имело худшую производительность (> 15 мин).
Мой вопрос в том, будет ли способ распространять видеокадры с лучшей производительностью, нежели все процессы загружают само видео.
Обратите внимание, что это выполняется на двойной 8-ядерной машине с 64 ГБ памяти.
Вы изучали темы? (например, http://pymotw.com/2/threading/) – boardrider