C 中针对 100 万条记录的数组的内存优化

Posted

技术标签:

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

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

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

【问题讨论】:

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于C 中针对 100 万条记录的数组的内存优化的主要内容,如果未能解决你的问题,请参考以下文章

数据库访问性能优化

Mysql 性能调优问题

JVM性能优化对象内存分配之虚拟机参数调优分析

Android 性能优化之内存泄漏检测以及内存优化(上)

mysql 表记录超过十万条后,查询速度特别慢?

Android 性能优化之内存泄漏检测以及内存优化(上)