2015-06-17 16 views
4

У меня есть ряд датчиков, подключенных к ПК, которые измеряют различные физические параметры, такие как сила, скорость вращения и температура. Эти датчики непрерывно производят образцы с определенной частотой дискретизации. Образец состоит из метки времени и самого измеренного измерения; частота выборки находится в величинах одноцифрового килогерца (то есть от 1 до 9000 выборок в секунду).Быстрое распределение памяти для сбора данных в реальном времени

ПК должен считывать и хранить эти образцы в течение заданного периода времени. Затем собранные данные далее обрабатываются и оцениваются.

Что было бы разумным способом буферизации образцов? При некоторых реалистичных настройках приобретение может легко собрать пару мегабайт в секунду. Также пейджинг может быть критическим в том случае, если память распределяется быстро, но требует замены при записи.

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

Это принципиальный концептуальный вопрос. Тем не менее, более конкретно:

  • Он должен полагаться только на переносные функции, такие как POSIX. Возможности Qt во вселенной тоже прекрасны.
  • Датчики могут быть сопряжены различными способами. IP - одна из возможностей. Обычно датчики напрямую подключаются к ПК через локальные каналы (RS232, USB, карты расширения и т. Д.). То есть, достаточно быстро.
  • Метки времени в основном применяются самого оборудования приобретения, если он способен при этом, чтобы избежать дрожания по сети и т.д.

обдумывая

Должен ли я действительно беспокоиться? По-видимому, проблема переводится в три сценария:

  1. Данных достаточно мало. Его можно легко буферизировать в одном большом предварительно выделенном буфере.
  2. Данные собираются медленно. Выделение буферов «на лету» отлично.
  3. Существует так много данных, полученных при высоких частотах выборки. Тогда распределение не является проблемой, потому что буфер в конечном итоге будет переполняться. Проблема скорее в том, как достаточно быстро перевести данные из буфера памяти в постоянное хранилище.
+0

В какой операционной системе вы нацеливаетесь? – SirDarius

+7

Взгляните на кольцевые буферы. Они обычно используются для буферизации данных в режиме реального времени. – jaggedSpire

+0

Что такое интерфейс с датчиками? IP/сеть? Где применяется метка времени, на датчике или после трансспорта на ПК? –

ответ

1

Идея для решения такого рода проблем может быть следующим:

Отдельная проблема в 2-х или более процессов в зависимости от того, что вам нужно сделать с вашими данными:

  • приобретателя
  • Analyzer (если вы хотите обрабатывать данные в режиме реального времени)
  • Writer

Храните данные в кольцевом буфере в общей памяти (я рекомендую использовать boost :: interprocess).

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

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

Смежные вопросы