【问题标题】:How to efficiently store a task information on a year calender如何有效地在年历上存储任务信息
【发布时间】:2015-06-23 11:28:48
【问题描述】:

我有一个嵌入式系统(没有任何操作系统的 MCU),最终用户应该能够定义一年的系统级别(范围:0-100)。举个例子(时间×天矩阵):

       | 1st Jan | 2nd Jan | 3rd Jan | .. | 31 Dec |
00:30  |  40 (%) | 40      |  45     | .. |   50   |
01:48  |  48     | 47      |  55     | .. |   33   |
02:26  |  64     | 64      |  60     | .. |   68   |
..     |  ..     | ..      |  ..     | .. |   ..   |
22:15  | 79      | 82      |  89     | .. |   100  |
23:37  | 100     | 100     |  97     | .. |   100  |

我的想法是将数据存储为:time [in minutes], sysLevel 所以上表是这样的:

 typedef struct{
   uint16_t minute; //scale: 0 - 1440 min
   uint8_t level; //scale 0 - 100 (%)
 }timeLevel_t; //3 byte

然后将每一天存储为

timeLevel_t firstJan[24] = { .. }; //it stores level changes, the array length doesn't have to be 24
timeLevel_t secJan[17] = { .. };
timeLevel_t thirdJan[20] = { .. };
...

(我将从 CSV 文件中获取数据,现在在这个问题上考虑它可能超出主题)。

系统期望在最坏的情况下有一个每小时任务定义,因此 24 小时的 timeLevel_t(3 字节)定义将是每天 72 字节数据,那么 365 天的数据将是 26280 字节数据。

您是否会建议一种内存效率更高的算法来存储日历年的信息(程序将每年更新它,以便考虑到 2 月 29 日)?

另外?做一个二维数组,一维存储日期信息,另一维存储timeLevel_t会更好吗?

【问题讨论】:

  • 在我看来,数据的来源(你提到了一个 CSV 文件)是系统设计中非常重要的一部分。我认为您需要更具体地了解数据的存储位置(闪存/内存/网络驱动器)以及数据的访问方式。
  • 0-1440 需要 11 位,0-100 需要 7 位,因此每个条目需要 18 位。也许您可以通过将分辨率降低到 2 分钟和 2 个百分点来将其压缩到 16 位?您还可以将四个 18 位条目打包成 9 个字节,但这会使代码复杂一些。
  • 我将信息存储在MCU的内存中(超过2.62 kB),并通过网络更新数据(可以逐块更新(月))。我认为理想的数据来源应该考虑到不失去问题的重点(每年一次的过程)。
  • 我也在考虑挤压比特,但找不到一种聪明的方法。我想知道是否可以压缩(编码)数据并仅解压缩(解码)当天的数据并删除旧数据
  • 如果您有 26280 字节的未压缩数据和 2620 字节用于存储该数据,则需要 10:1 的压缩比。或者换句话说,您需要能够以平均 2 位/事件对每个事件进行编码。这不太可能发生。如果 2.62kB 的内存也被用于代码和其他数据,那么情况会更糟。

标签: c algorithm memory-efficient


【解决方案1】:

您必须存储额外的信息,例如#days/month,或者假设每个 31 并浪费几个字节。

这完全取决于您的痛点。您可以打包更多字节以不浪费位,但代价是代码复杂性和计算时间。

如果存储非常宝贵,您可以将所有内容存储在一个巨大的一维数组中,并将多余的位用于其他内容。 例如,第 11 位可以表示“下一天”,第 12 位可以表示“下个月”,然后您可以爬取数组并查找一年中的任何一天。而且你还有另外 4 位用于各种恶作剧。

请详细描述问题。

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2012-06-04
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多