首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL++,存储实时数据

MySQL++,存储实时数据
EN

Stack Overflow用户
提问于 2010-01-26 19:39:36
回答 4查看 1.3K关注 0票数 3

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

EN

回答 4

Stack Overflow用户

发布于 2010-01-26 20:52:35

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

当然,这提出了数据溢出的问题,即数据传入的速度快于它被注入数据库的速度,并且内存中的存储结构被填满。这可能会导致数据丢失。如果你丢了一些样本,那会有多糟糕?

票数 4
EN

Stack Overflow用户

发布于 2010-01-26 21:57:10

我不认为在每个值有1个单独插入的情况下能够保持这样的速度,但是如果您将它们批处理成足够大的批,您可以将它们作为一个查询发送,这应该是可以的。

代码语言:javascript
复制
INSERT INTO records(timestamp, value)
  VALUES(1, 2), (3, 4), (5, 6), [...], (399, 400);

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-01-27 01:39:53

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2139081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档