当不知道总需求时,给定时间malloc的最佳量是多少?

时间:2013-12-04 07:29:32

标签: c memory-management malloc

我实现了一个多级缓存模拟器,需要存储模拟器中当前的值。使用当前配置,存储的所有值的最大大小可以达到2G。显然,我不会假设这种最糟糕的情况,并预先分配所有内存。相反,我将程序设置为根据需要在块中分配内存。由于我calloc以便在先前在指定位置没有发生写入时提供0值,因此加剧了这种分配的费用。

我的问题是,每次需要多少内存时,是否有一个很好的启发式方法?目前我正在使用一个任意值,我考虑了一些解决方案,它将使用整个系统内存的一些比例(我认为可以在编译和/或运行时动态检测它),但即使使用后者,我也使用了任意比例仍然不适合我。

对此类情况的最佳实践的任何见解都将不胜感激!

2 个答案:

答案 0 :(得分:1)

一个常见的经验法则是在每次重新分配时以几何方式增长,例如加倍。

答案 1 :(得分:0)

最好了解程序的分配模式,如果这是您需要优化的问题。这是通过了解程序的实现,它在其中运行的体系结构以及通过观察(例如时间和内存分析)来实现的。

事实是,您可以从多个角度进行优化,但事情会随着时间而变化(投入变化,环境变化)。在用户土地上,你的内存使用已经是第二次猜测了。

鉴于您的分配大小,我假设您已经依赖于系统,该系统将根据需要默认为后备存储。因此,您无法控制分页内容或何时分页。在这种情况下,窥视可用的物理内存并不值得考虑,您将不得不努力做得比系统现有的虚拟内存实现更好。其中一些系统试图使用所有可用内存(例如“未使用的RAM是浪费的RAM”)。

话虽如此,如果这些假设是正确的:通常最好减少分配大小和工作集,并根据需要自己进行I / O.

您的操作系统也可能使用磁盘缓存;读取和写入可能比您怀疑的大块内存要快。

更深入:对这些大型数据集使用虚拟内存或内存映射文件。你的内核可能会很好地处理这些情况。

  

显然,我不会假设这种最糟糕的情况并预先分配所有内存。

然后,您可能会惊讶地发现单独2 GB calloc可能比某些环境中提出的其他替代方案更好,因为大calloc只能在虚拟内存中保留一个域,仅在您访问页面时加载/初始化页面。根据您的使用情况,这种方法将比您给出的一些替代方案好得多。

在理解程序或输入的分配模式时,许多问题的一个良好起点是开始保守,然后根据观察做出最有益的调整。在许多情况下,您需要的信息比a)准确确定调整大小时需要调整大小的数量b)在适当情况下重新使用分配c)为手头的问题很好地设计数据。