хранить переменные времени выполнения в C ++ - PullRequest
0 голосов
/ 16 сентября 2010

Это проблема C ++. У меня есть программа отслеживания объектов, которая берет изображения из 0, ..., n в цикле. В текущем кадре вычисления основаны на предыдущих кадрах, поэтому мне нужно хранить эти переменные, матрицы и т. Д. Для последующего использования. Эта программа должна быть теперь интегрирована в другую систему, которая будет предоставлять изображение, и я должен вернуть результат отслеживания. В дальнейшем система выполняет другие процессы, поэтому моя программа должна стать функцией для распространения в виде DLL.

Мне нужно сохранить мои переменные и матрицы из предыдущих изображений, чтобы использовать их снова. Я не знаю, лучше ли записывать их на жесткий диск и читать их снова в другом случае. Если это так, то каков наилучший способ и тип данных / файл для записи / чтения. Система стремится быть в режиме реального времени.

Спасибо

Ответы [ 5 ]

2 голосов
/ 16 сентября 2010

Единственное, на что вы можете обратить внимание, что NOT THREADSAFE - это сохранить локальные переменные как static. Если вы не знакомы со статическими переменными C / C ++, они хранятся в глобальном пространстве памяти и «запоминаются» между вызовами функций. Они похожи на глобальные переменные, но доступ к ним может получить только функция, в которой они объявлены. Выполните это пару раз и посмотрите, что произойдет.

void foo()
{
  static int x=0;
  x++;
  cout << x << endl;
}

Помните, вы не можете иметь несколько потоков, вызывающих foo, потому что теперь есть только одно состояние!

В качестве альтернативы вы можете сделать что-то, где вы создаете структуру, которая содержит копию вашего локального состояния, и вы передаете это.

struct state
{
  int x
};

void bar(state& s)
{
  s.x++;
  cout << s.x << endl;
}
1 голос
/ 16 сентября 2010

Это зависит от вашей платформы, но в наши дни редко встречается платформа, у которой нет лишних куч памяти.Так что, если вы просто сохраняете данные из предыдущего прохода, независимо от того, сколько их, мой первый шаг - сохранить все это в памяти где-нибудь.

Если у вас кончится нехватка места, мой второй шаг будет посмотреть, как получить больше оперативной памяти для вашей системы.Если это стоит дополнительных 100 долларов, а вы не производите тысячи единиц, то это может сэкономить вам деньги в долгосрочной перспективе в течение инженерных часов.

Если нет, , тогда Вы можете беспокоиться о дополнительной сложности попыток сохранения и восстановления с диска в режиме реального времени.

0 голосов
/ 16 сентября 2010

Привет, ребята, большое спасибо, у меня уже есть некоторые идеи от вас:

  1. STL
  2. файлы с отображением в памяти
  3. Многопоточность

Я начну работать с этими решениями и посмотрим, каковы ограничения каждого из них с требованием реального времени.

Я вернусь, чтобы опубликовать здесь позже окончательное решение, и в случае, еслиМне нужно больше подробностей, я пойду по конкретной теме.

Спасибо

0 голосов
/ 16 сентября 2010

Некоторые идеи и предложения:

Хранение изображений или атрибутов изображений?

В целом, изображение будет занимать больше места, чем атрибуты или данные, рассчитанные по изображению.Возможно, вы можете хранить атрибуты изображений, а не всего изображения.

Кэшировать данные

Поместить в память как можно больше данных, а остальные сохранить в файле.Вопрос, требующий ответа, заключается в том, сколько информации должно быть в памяти (например, последние N элементов или, возможно, первые N элементов).

Multi (задача или поток)

Есть один поток, который кэширует изображения по требованию.Когда изображения получены, они помещают либо изображение в память (либо атрибуты).Когда фиксированная область памяти заполняется, она помещает изображение (или атрибуты) во внешнюю память (например, файлы).Основной поток будет запрашивать изображения из потока кэширования.После того, как поток кэширования удаляет изображение, он заменяет это изображение (или атрибуты) одним элементом данных из файла.Поток может спать, пока не появится новое изображение или не будет запрошено более старое изображение.

0 голосов
/ 16 сентября 2010

Не совсем ответ, просто более длинный запрос подробностей.

Любая проблема с сохранением данных включает такие решения, как:

  • требуемый срок службы: управляемый приложением, поток,процесс до перезагрузки хоста неопределенный ...?
  • сколько будет одновременных читателей / писателей для хранилища
  • как читатели / писатели разнесены по сетям / оборудованию (например, проблемы с порядком байтов), задержки)

Вы действительно не предоставили достаточно подробностей, чтобы серьезно начать это.

Если ваша догадка верна, а файл - подходящий механизм, вы можетеПодумайте, работает ли отображение памяти в соответствии с вашими требованиями ... оно имеет тенденцию быть быстрее, чем потоковый ввод / вывод файла.

Альтернативы включают в себя сегмент общей памяти (может жить дольше, чем процесс создания), куча ...?

Если вы действительно заинтересованы в механизмах сериализации, вы можете взглянуть на повышение.

В любом случае, я ухожу из дома, так что, вероятно, это будет кто-тоSE кто отвечает ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...