【问题标题】:MySQL++, storing realtime dataMySQL++,存储实时数据
【发布时间】:2011-01-09 11:48:41
【问题描述】:

首先,我是一名工程师,而不是计算机科学家,所以请保持温和。 我目前有一个使用 MySQL++ 的 C++ 程序。该程序还包含 NI Visa 运行时。其中一个中断处理程序每​​秒从 USB 设备接收数据(1 个字节)大约 200 次。我想将此数据与远程服务器上的每个样本的时间戳一起存储。这可行吗?谁能推荐一个好的方法? 问候, 迈克尔

【问题讨论】:

  • 数据是突发的还是连续的?
  • 我认为每字节一个时间戳是浪费空间和时间,尤其是每秒 200 次。您可能需要检查您的 USB 设备,看看它是否可以在每次中断时传输更多字节,例如每个中断 64 字节。这将允许更多时间执行外部中断代码。

标签: c++ sql mysql real-time mysql++


【解决方案1】:

我认为对远程服务器执行每秒 200 个事务的要求很高,尤其是当您考虑到这些事务将发生在必须完成其工作并快速完成的中断处理程序的上下文中时。我认为最好将您的中断处理程序与您的数据库访问分离-也许让中断处理程序将传入的数据和时间戳存储到某种内存数据结构中(数组、循环链表或其他任何东西,并具有适当的同步)并有一个单独的线程等待数据结构中的数据可用,然后将其泵入数据库。我希望保持该中断处理程序尽可能精简和确定,并且我担心通过网络访问远程服务器的数据库会太慢 - 或者更糟糕的是,大多数时间都可以,但有时会无缘无故转到 h*ll。

这当然会引发数据溢出的问题/问题,即数据进入的速度超过了将其泵入数据库的速度,并且内存中的存储结构被填满。这可能会导致数据丢失。如果你丢了一些样品有多糟糕?

【讨论】:

    【解决方案2】:

    我认为您无法通过每个值 1 个单独的插入来保持该速度,但如果您将它们分成足够大的批次,您可以将它们作为一个查询发送,应该没问题。

    INSERT INTO records(timestamp, value)
      VALUES(1, 2), (3, 4), (5, 6), [...], (399, 400);
    

    只需将时间戳和值推送到缓冲区,当缓冲区大小达到 200(或其他任意数字)时,生成 SQL 并将全部发送出去。用 sprintf 构建这个字符串应该不会太慢。请注意从您的中断例程可能同时写入的数据结构中读取数据。

    如果您发现此 SQL 生成由于某种原因太慢,并且没有使用 API 的更快方法(例如存储过程),那么您可能希望与数据收集同时运行它。最简单的可能是将数据通过套接字或管道流式传输到执行 SQL 生成的另一个进程。也有多线程方法,但它们更复杂且容易出错。

    【讨论】:

    • 我同意时间戳问题。我将缓冲样本并为每 200 个值添加一个时间戳。您建议使用什么存储机制来存储这些值并从中读取,以避免中断访问它时出现问题?
    • 我需要熟悉相关的硬件和操作系统才能为中断问题提供权威答案。通常有一种方法可以防止中断在短时间内发生,该时间足以将数据传输出中断使用的结构。或者,可能有一个原子指令可以切换您所指的两个缓冲区中的哪一个,但这也是特定于平台的。我希望任何提供此中断例程的东西也能提供一种管理其执行的方法。
    • 我将尝试在 2 个缓冲区之间切换。感谢您的建议。
    【解决方案3】:

    在我看来,您应该做两件事:1. 缓冲数据和 2. 每个缓冲区一个时间戳。 USB 协议不是基于字节的,而是基于更多消息的。如果您正在跟踪消息,则为消息添加时间戳。

    此外,数据库更愿意接收数据块或数据块,而不是一次接收一个字节。每个事务在数据库中都有开销。要衡量效率,请将开销除以事务中的字节数。你会看到大块比大量小交易更有效。

    另一种选择是将数据存储到文件中,然后使用 MySQL LOADFILE 函数将数据加载到数据库中。此外,将数据存储到缓冲区中,然后使用 MySQL C++ 连接器流将数据加载到数据库中。

    【讨论】:

    • 我会按照你的建议做 1 和 2。关于将值本地存储在文件中,您有什么建议? SQLite?
    • 关于在文件中存储值的格式,请阅读 MySQL LOADFILE 函数。它将告诉它所需的文件格式。要在程序外部存储变量,在 Windows 上,您可以使用注册表。另一种方法是存储在文件中。您可以使用 XML、INI 或您自己的格式。我没用过 SQLite,所以无法评论。
    【解决方案4】:

    即使您在服务器端正确缓存了多线程,也不能保证比公寓更快,除非有一些奇怪的 cpu 优先级偏好。如何使用着色器并让 windows.h 中的引用值作为时间戳

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2019-09-06
      相关资源
      最近更新 更多