【问题标题】:Memory awareness and large data内存感知和大数据
【发布时间】:2012-05-04 23:35:57
【问题描述】:

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

我目前管理它的方式是将缓存限制为特定数量的条目。该解决方案有效,但效果不佳。一种更灵活的方法是对所有缓存设置一些内存限制,当达到限制时,根据缓存的重要性和大小禁用缓存甚至清空一些缓存。

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

我想知道是否有一些“标准”技术可以做这样的事情。我应该搜索任何成语/模式吗?

另外,最好自己跟踪内存使用情况(似乎更便携但也更费力)或使用一些技术,如在 linux 上读取 /prco/pid 等。

【问题讨论】:

标签: c++ memory memory-management


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2014-02-14
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多