【问题标题】:Memory optimization in C for an array of 1 million recordsC 中针对 100 万条记录的数组的内存优化
【发布时间】:2012-09-02 16:36:04
【问题描述】:

我正在编写一个程序,它需要我创建一个包含一百万条记录的数组。数组索引是唯一的 id(0-million 代表唯一的产品 id)。首先,所有元素都初始化为零。它们会根据销售的产品而增加。

然而,这种方法的空间复杂度很高(4 * 百万字节)。后来我看到只有某些产品需要频繁更新。那么有什么方法可以减少内存使用并跟踪所有产品?

【问题讨论】:

  • 4 MB 不是很多...
  • 你可能想要hash table之类的东西?
  • 我想尽量减少内存使用量。
  • @dbaupp 你不是为 AVR 平台开发的,对吧?

标签: c optimization memory


【解决方案1】:

如果您不需要频繁更新,则可以将所有结果存储在一个文件中。每当您更新任何条目时,您都可以创建一个临时文件,其中包含所有其他条目以及更新的条目。之后,您可以使用rename(temp,new); 更改临时文件的名称。

虽然,包含数百万条记录的数组不需要那么多内存(仅 4 兆字节)。所以,你的方法是最好和最简单的。

最好的方法(算法)是制作一个哈希表来存储所有条目。但如果你不是 C 方面的专家,那么制作哈希表对你来说可能是个问题。

【讨论】:

    【解决方案2】:

    对我来说,这听起来更像是数据库中的表而不是内存中的数组。如果您的用例允许,我会改用数据库。

    否则,如果在您的用例中:

    1. 很大一部分产品最终会被使用,
    2. 内存有限,
    3. 外部存储(磁盘、串行存储器)可用,
    4. 需要与 RAM 速度相当的平均访问性能,并且
    5. 增加最坏情况的访问时间是可以接受的,

    那么你可以尝试某种缓存方案(也许是 lru?)。这将使用更多的代码空间,在一定程度上增加您的平均访问时间,并更显着地增加最坏情况下的访问时间。

    如果大部分产品不仅不经常使用,而且从未使用过,那么您应该查看@fatrock92 对哈希表的建议。

    【讨论】:

      【解决方案3】:

      最好对数组使用动态分配内存。 使用 malloc 或 realloc 可以为您提供更好的内存分配方式 我想你知道如何使用 malloc 和 realloc

      【讨论】:

        【解决方案4】:

        您可以使用link list,因此您可以在需要时添加或更新列表中的元素。
        您还可以在每个节点中保留上次访问权限,以便您可以删除最近未使用的节点。

        【讨论】:

          猜你喜欢
          • 2017-01-27
          • 1970-01-01
          • 2012-05-16
          • 1970-01-01
          • 1970-01-01
          • 2017-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多