【问题标题】:Where to store temporary data (embedded C)在哪里存储临时数据(嵌入式 C)
【发布时间】:2016-10-31 20:52:06
【问题描述】:

我有一个非常强大的嵌入式 linux 设备,用于使用 C 从各种套接字/fd:s 收集数据。这些数据将被解析、缓冲并传递到 TCP/IP 或 UDP 套接字以转移到其他地方进行长期储存。这最后一步发生在获得足够数量的数据时,或者在触发其他一些事件时。

我的问题是:有什么理由不缓冲堆上的所有内容(而不是写入/读取某些 linux 文件描述符)

  • 我的设备的唯一用途就是这种类型的数据采集
  • 设备从不用于长期存储

仅使用堆听起来违反直觉,但我真的不明白为什么我们不应该在堆中存储尽可能多的东西,至少在 RAM 变得稀缺之前是这样。

【问题讨论】:

  • 你有多少内存?数据进来的速度有多快?在您能够将数据传输到长期存储之前,最长的延迟是多少?您能够以什么速率传输数据?获得系统的所有参数后,就可以确定使用 RAM 是否可行。
  • 为什么使用堆是“违反直觉的”?
  • 是的,你是对的,现在我明白了。您根本不需要将数据存储在堆上。尽管有任何其他考虑。除非,您需要在磁盘上创建的多个不同文件共享数据,或者必须在将数据写入磁盘之前完全获取数据。这取决于您的问题中未提及的许多事情。缓冲可能有意义,但我需要了解系统的所有属性才能做出决定。

标签: c linux file-io


【解决方案1】:

我不太明白你为什么说“使用堆是违反直觉的”——数以百万计的嵌入式路由器和交换机将堆用于存储和转发队列(我知道你所做的类似)。

这在很大程度上取决于您获得的数据。如果您的设备发生电源故障或其他重置事件,可以重新获取的任何内容都不需要永久存储。

但是,对于难以或不可能重新获取且有价值的数据(例如传感器数据),您可能希望将其推送到安全的地方,以防止重置和断电。

另一方面,如果您的数据不是分段的而是面向流的,那么将其存储到文件中可能会容易得多 - 另外请注意,内存不足和堆内存泄漏可能会对在嵌入式系统中调试。

【讨论】:

    【解决方案2】:

    存储在主存储器中的数据通常不会在断电时保留。如果您收集的数据必须在断电后仍然存在,则必须将其存储在非易失性存储器中。

    不幸的是,仅仅将数据写入文件并不能保证可靠的存储,因为大多数 linux 文件系统都存在断电数据丢失的风险。

    在文件中存储可能有用的第二种情况是,文件中收集的数据可以在应用程序崩溃后幸免于难。我们都尽最大努力不让我们的应用程序崩溃,但尽管付出了所有努力,它仍然经常发生。 :-(

    【讨论】:

      猜你喜欢
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2012-02-24
      • 2012-11-14
      • 2012-09-02
      • 2011-09-23
      • 1970-01-01
      相关资源
      最近更新 更多