【问题标题】:What portable data backends are there which have fast append and random access?有哪些具有快速附加和随机访问的便携式数据后端?
【发布时间】:2010-07-09 10:22:07
【问题描述】:

我正在开发一个Qt GUI,用于可视化通过 TCP/IP 连接接收的“实时”数据。问题是数据到达的速度相当快(每秒几十 MB) - 即使我没有进行任何花哨的可视化,它的输入速度也比我能够想象的要快 - 我只是在 @ 中显示数据987654322@对象。

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

我想知道的是:由于数据来得如此之快,我不可能将所有数据都保存在内存中。客户甚至可能让 GUI 整夜运行,因此会累积数千兆字节的数据。将这些数据写入磁盘的好的数据存储系统是什么?它应该具有以下属性:

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

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

也许是一些 SQL 数据库,或者像 CouchDB 这样的东西?如果有人能分享他在这种情况下的经验,那就太好了。

【问题讨论】:

    标签: c++ database qt storage


    【解决方案1】:

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

    您也可以尝试将SOCI 作为 C++ 数据库访问 API,它似乎可以与 sqlite 配合使用(我暂时没有使用它,但打算使用它)。

    my2c

    【讨论】:

    • 感谢您提醒我sqlite。我以前用过,可能是个选择。
    • @Frerich:不客气。我对您将使用的工具的性能感兴趣。如果性能真的很差,您将以文件结尾...
    【解决方案2】:

    我会推荐一个简单的基于文件的解决方案。

    如果您可以使用固定大小的记录:如果您以恒定的采样率连续获取数据,当您知道第一个数据点的时间戳并且采样率。如果采样率变化,则为每个数据点写入时间戳。现在随机访问需要二分查找,但还是够快的。

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

    如果你使用Qt来实现这种方案,你需要两组QFile和QDataStream实例,一组用于写,一组用于读。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2016-08-25
      • 1970-01-01
      • 2016-06-06
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多