记忆意识和大数据

时间:2012-05-04 23:35:57

标签: c++ memory memory-management

我目前正在开发一个使用大量文本的项目(数百MB到几GB的文本 - DBpedia数据集)。为了节省空间,我将字符串映射到数字,并仅在我需要打印东西时才使用字符串。为了加速使用数据的算法,我设计了一个Cache类作为键值缓存。问题当然是,当程序运行较长时间时,缓存变得非常大。

我目前管理它的方法是将缓存限制为特定数量的条目。这个解决方案正在运行但不是很好。一种更灵活的方法是在所有缓存中都有一些内存限制,当达到限制时,禁用缓存甚至清空一些缓存,具体取决于它们的重要性和大小。

我正在考虑实现一个sizeB()方法,它会以字节为单位返回一个缓存大小,这样每个实例都可以报告它使用了多少内存。但是,这当然不能解决何时停止缓存的问题......我可能需要手动跟踪所有内存使用情况。也许某些单身CacheFactory所有缓存都已注册,并且在达到限制时也会被清空?

我想知道是否有一些“标准”技术来做这样的事情。我应该搜索哪些习语/模式?

另外,自己跟踪内存使用情况(看起来更便携但也更费力)或使用某些技术(如linux上的read / prco / pid等)会更好。

1 个答案:

答案 0 :(得分:1)

是的,有缓存和内存重新平衡的标准技术。最简单的方法将遵循您的想法 - 创建缓存“工厂”或“经理”。它将按需分配缓存对象,每个对象都有一个大小限制(将其视为CPU缓存行,其预设大小为64字节)。只知道分配给管理器的高速缓存对象的数量,就能够粗略估计已用内存的数量,并将其与total_max_limit进行比较,并根据运行的机器和操作系统的类型等进行比较。因此,当命中total_max_limit并且需要释放一些缓存对象时,最常用的方法是LRU(选择最近最少使用的缓存对象来销毁)。为了实现这一点,你将在deque中存储指向管理器内缓存对象的指针,当访问缓存对象时,它告诉管理器(通过缓存对象结构中的指针)“标记为已访问”意味着移动指针这个缓存对象到deque的前面。这意味着deque中的最后一个指针(* tail)引用最近最少使用的缓存对象。而factory.rebalance()只是pop_back并释放返回的对象。

还有其他算法,但LRU是最常用的算法。优先级缓存也可以使用它来实现。你想要的是创建几个'缓存管理器'并分发他们的total_max_limits,以便优先级越高,内存越少,优先级越低,越少越少,你得到的结果是优先级较低的东西将被驱逐得更快,更高优先级的东西将驻留在内存/缓存中。这种方法可能比每次为每个缓存计算一些基于权重的公式更好,以选择应该将此特定缓存对象移动到deque的头部的距离。