Я пишу код для генерации и обработки больших объемов видеоданных.Сначала я намереваюсь работать только со случайными данными.
Моя техника состоит в том, чтобы рассматривать пиксель как карту целочисленных значений R, G, B, A, чтобы рассматривать кадр видео как вектор этих пикселей.карты, и рассматривать видео во времени как вектор этих векторов карт пикселей.Я написал три функции, которые делают это надежно, но сталкиваются с проблемами производительности при их масштабировании.
(defn generateFrameOfRandomVideoData
"Generates a frame of video data which is a vector of maps of pixel values."
[num-pixels-in-frame]
(loop [num-pixels-in-frame num-pixels-in-frame
pixels-added 0
frame '[]]
(if (> num-pixels-in-frame pixels-added)
(recur num-pixels-in-frame
(inc pixels-added)
(conj frame (assoc '{}
:r (rand-int 256)
:g (rand-int 256)
:b (rand-int 256)
:a (rand-int 256))))
frame)))
(defn generateRandomVideoData
"Generates a vector of frames of video data."
[number-of-frames frame-height frame-width]
(loop [number-of-frames number-of-frames
frame-height frame-height
frame-width frame-width
frames '[]]
(if (> number-of-frames (count frames))
(recur number-of-frames
frame-height
frame-width
(conj frames (generateFrameOfRandomVideoData (* frame-height frame-width))))
frames)))
(defn generateRandomizedVideo
"Generates video data based on the specified parameters."
[number-of-frames frame-height frame-width]
(assoc '{}
:number-of-frames number-of-frames
:frame-height frame-height
:frame-width frame-width
:frames (generateRandomVideoData number-of-frames frame-height frame-width)))
Вызовите эту функцию, чтобы использовать функции для генерации 60 кадров видео 1920X1080p:
(generateRandomizedVideo 60 1920 1080)
Когда я запускаю этот вызов для генерации 10-кадрового видео 1920X1080p, алгоритм завершается довольно быстро.Когда я вызываю его для создания 60 кадров видео, оно застревает, не завершается и генерирует огромное количество памяти.Я смотрел, как это занимает 16 ГБ памяти.
Это на самом деле не имеет никакого смысла для меня.Мой алгоритм O (количество кадров * (высота кадра * ширина кадра)).Количество кадров O (n) и (высота кадра * ширина кадра постоянна при O (высота * ширина). Эти аргументы приводят к O (n).
Теперь, когда я убедил себя инадеюсь, вы понимаете, что мой алгоритм не просто неразрешим, я думаю, у меня есть несколько взаимосвязанных вопросов:
Сколько памяти занимает целое число в Clojure в битах? Кажется, я не могу найти этоинформация где угодно.
Какие накладные расходы вызывает хранение целых чисел, связанных с ключами карты? Является ли это более затратным с точки зрения памяти, чем просто хранение их в векторе?
Почему алгоритм затягивается с точки зрения времени и памяти для большого количества кадров? Что Clojure делает для увеличения памяти?
Спасибо!