Prealloc список памяти

0

Мы пытаемся разработать приложение в реальном времени. В этой программе 4 камеры отправляют 100 раз в секунду массив изображений в метод. В этом методе я должен сделать копию каждого массива. (Используется для ImageProcessing в другом потоке).

Я хотел бы сохранить последние 100 изображений каждой камеры в списке.

Проблема заключается в следующем: как превалировать такую память в списке (новые в конструкторе?).

Я хотел бы использовать что-то вроде ringbuffer с фиксированным размером, выделенным массивом memories и fifo main.

Любая идея как?

Edit1: Пример псевдокода:

// called from writer thread
void receiveImage(const char *data, int length)
{
   Image *image = images.nextStorage();
   std::copy(data, data + length, image->data);
}

// prealloc 
void preallocImages()
{
   for (int i = 0; i < 100; i++)
      images.preAlloc(new Image(400, 400));
}

// consumer thread
void imageProcessing()
{
    Image image = image.WaitAndGetImage();
    // ... todo
}
Теги:
multithreading
memory
real-time

1 ответ

1
Лучший ответ

Предположим, что вы создаете класс Image для хранения данных для изображения, имея буфер буфера, который имеет значение:

std::vector<Image> images(100);
int next = 0;
...
while (whatever)
{
    images[next++] = get_image();
    next %= images.size();
}

Вы говорите о предопределении памяти: каждый конструктор Image может владеть задачей предопределения памяти для собственного изображения. Если бы вы могли сделать это с помощью new или если у вас есть изображения с фиксированным размером, которые не особенно велики, вы можете попробовать массив с пропорциональным размером в классе Image... таким образом, все данные изображения будут храниться в памяти в памяти - это может быть немного быстрее, чтобы итерации изображений "в порядке". Обратите внимание, что просто выделение виртуальных адресов еще не означает, что имеется физическая резервная память, и этот материал по-прежнему может быть заменен на виртуальную память. Если у вас есть проблемы с доступом к памяти, вы можете подумать о сканировании по памяти для изображения, которое вы ожидаете использовать незадолго до его использования, или с помощью функций ОС, чтобы сообщить ОС о ваших предполагаемых шаблонах использования памяти. Возможно также получить что-то работающее и профилировать его первым ;-).

Для обработки FIFO просто добавьте еще одну переменную, начинающуюся с 0, если она != next тогда вы можете "обрабатывать" изображение по этому индексу в векторе, а затем увеличивать переменную до тех пор, пока она не настигется next.

  • 0
    Есть ли готовые реализации для этого также как потребитель / производитель? Я редактирую «пример».
  • 0
    @Viatorus: не в самой библиотеке C ++ Standard, но у boost есть предложение, которое может подойти . Приветствия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню