哪些便携式数据后端有快速附加和随机访问?

时间:2010-07-09 10:22:07

标签: c++ database qt storage

我正在使用Qt GUI来显示通过TCP / IP连接接收的“实时”数据。问题是数据到达的速度相当快(每秒几十MB) - 即使我没有做任何花哨的可视化,它的速度也快于我能够可视化 - 我只是在{{ {3}}对象。

如果这还不够,GUI还允许按下“冻结”按钮,该按钮将暂停更新GUI(但它将继续在后台接收数据)。一旦冻结选项被禁用,就应该可视化在后台累积的数据。

我想知道的是:由于数据传输速度如此之快,我无法将所有数据都保存在内存中。客户甚至可能使GUI运行过夜,因此将累积数十亿字节的数据。将这些数据写入磁盘的数据存储系统是什么?它应该具有以下属性:

  • 在桌面系统上使用它不应该太多工作​​
  • 最后应该快速添加新数据。我再也不需要触摸以前写过的数据,因此不需要写入任何地方,但不需要结束。
  • 应该可以随机访问数据中的记录。这是因为在我的GUI中滚动将使得必须快速显示数据流中的N到N + 20(或者我的表的高度)条目。

进入的数据可以分成记录,但不幸的是记录没有固定的大小。我宁愿不对它们施加最大尺寸(至少如果没有这样做就能获得良好的性能)。

可能是某些SQL数据库,或类似QTableView之类的东西?如果有人可以分享他在这种情况下的经验,那就太好了。

2 个答案:

答案 0 :(得分:1)

我认为sqlite可能会成功。它看起来很快。不幸的是,我没有像你这样的数据流,但它可以很好地作为日志记录器的后端。我有一个GUI,您可以在其中查看n,n + k日志。

您也可以尝试SOCI作为C ++数据库访问API,它似乎可以正常使用sqlite(我现在还没有使用它,但计划)。

MY2C

答案 1 :(得分:0)

我建议使用简单的基于文件的解决方案。

如果您可以使用固定大小的记录:如果您以恒定的采样率连续获取数据,当您知道第一个数据点的时间戳时,可以轻松快速地随机访问数据采样率。如果采样率变化,则为每个数据点写入时间戳。现在随机访问需要二进制搜索,但它仍然足够快。

如果您有可变大小的记录:将可变大小数据写入一个文件,并将其他文件写入索引(固定大小)写入数据文件。如果采样率变化,也写入时间戳。现在,您可以使用索引文件快速进行随机访问。

如果您使用Qt实现此类解决方案,则需要两组QFile和QDataStream实例,一组用于写入,另一组用于读取。

关于性能的说明:每次写入数据点后都不要刷新文件。但请记住在对文件进行任何随机访问之前刷新文件。