Какие переносимые серверы данных имеют быстрое добавление и произвольный доступ? - PullRequest
1 голос
/ 09 июля 2010

Я работаю над графическим интерфейсом Qt для визуализации «живых» данных, получаемых через соединение TCP / IP.Проблема в том, что данные поступают довольно быстро (несколько десятков МБ в секунду) - они поступают быстрее, чем я могу их визуализировать, даже если я не делаю какой-либо причудливой визуализации - я просто показываю данные в виде QTableView object.

Как будто этого недостаточно, графический интерфейс также позволяет нажимать кнопку «Замораживание», которая приостанавливает обновление графического интерфейса (но будет продолжать получать данные в фоновом режиме).Как только опция Freeze была отключена, данные, накопленные в фоновом режиме, должны быть визуализированы.

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

  • Не должно быть слишком много работы, чтобы использовать его в настольной системе
  • Он должен быть быстрым при добавлении новых данных в конце.Мне больше не нужно трогать ранее записанные данные, поэтому запись в любое место, но конец не нужен.
  • Должна быть возможность произвольного доступа к записям в данных.Это потому, что прокрутка в моем графическом интерфейсе потребует быстрого отображения записей от N до N + 20 (или независимо от высоты моей таблицы) в потоке данных.

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

Может быть, какая-то база данных SQL или что-то вроде CouchDB ?Было бы здорово, если бы кто-то мог поделиться своим опытом с такими сценариями.

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Я думаю, что sqlite может сработать.Вроде бы быстро.К сожалению, у меня нет потока данных, как у вас, но он хорошо работает в качестве бэкенда для регистратора журналов.У меня есть графический интерфейс, где вы можете просматривать журналы n, n + k.

Вы также можете попробовать SOCI в качестве API доступа к базе данных C ++, похоже, он работает нормально с sqlite (я не использовал его сейчас, но планирую).my2c

0 голосов
/ 09 июля 2010

Я бы порекомендовал простое файловое решение.

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

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

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

И замечание по поводу производительности: не очищайте файл после каждой записи данных. Но не забудьте очистить файл перед выполнением произвольного доступа к нему.

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