草庐IT

c++ - 用于实时数据采集的快速内存分配

coder 2024-02-25 原文

我有一系列连接到 PC 的传感器,用于测量各种物理参数,例如力、转速和温度。这些传感器以一定的采样率连续生成样本。样本由时间戳和测量维度本身组成;采样率的数量级为个位数千赫兹(即,介于每秒 1 到 9000 个样本之间)。

PC 应该在给定的时间段内读取并存储这些样本。之后,收集的数据将得到进一步处理和评估。

缓冲样本的明智方法是什么?在一些实际的设置中,采集可以很容易地每秒收集几兆字节。如果内存分配速度很快但需要在写入时交换,分页也可能很关键。

我可以想到一种线程方法,其中一个单独的线程分配和管理一个池(锁定,因此不可交换)内存块。假设总是有足够的这些 block 被预先分配,进一步的分配只会阻塞(如果其他进程的页面之前必须换出)这个内存池的线程和获取可以不间断地进行。

这基本上是一个概念性问题。然而,更具体地说:

  • 它应该只依赖可移植的特性,比如 POSIX。 Qt 世界的功能也很好。
  • 传感器可以通过多种方式连接。 IP是一种可能性。通常传感器通过本地链路(RS232、USB、扩展卡等)直接连接到 PC。也就是说,足够快。
  • 时间戳主要由采集硬件本身应用(如果它能够这样做),以避免网络抖动等。

考虑一下

我真的应该担心吗?显然,问题分为三种情况:

  1. 收集的数据很少。它可以很容易地缓冲在一个大的预分配缓冲区中。
  2. 数据收集缓慢。动态分配缓冲区非常好。
  3. 以高采样率采集了如此多的数据。那么分配就不是问题了,因为缓冲区最终还是会溢出。问题在于如何足够快地将数据从内存缓冲区传输到永久存储。

最佳答案

解决这类问题的思路可以如下:

根据您需要对数据执行的操作,将问题分成 2 个或更多进程:

  • 收购方
  • 分析器(如果你想实时处理数据)
  • 作家

将数据存储在共享内存的循环缓冲区中(我推荐使用 boost::interprocess)。

Acquirer 会不断地从设备中读取数据并将其存储在共享内存中。同时,一旦读取了足够的数据来进行任何分析,分析器就会开始处理它。如果需要,它可以将结果存储到另一个循环缓冲区共享内存中。与此同时,Reader 将从共享内存中读取数据(已获取或已处理)并将其存储在输出文件中。

您需要确保所有进程都正确同步,以便它们同时完成工作并且您不会丢失数据(数据在处理或保存到输出文件之前不会被覆盖)。

关于c++ - 用于实时数据采集的快速内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30899159/

有关c++ - 用于实时数据采集的快速内存分配的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  6. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  7. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  8. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  9. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  10. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

随机推荐