【问题标题】:Why does loading cached objects increase the memory consumption drastically when computing them will not?为什么加载缓存的对象会大大增加内存消耗而计算它们不会?
【发布时间】:2011-12-18 21:15:20
【问题描述】:

相关背景资料

我已经构建了一个可以通过配置文件进行自定义的小软件。配置文件被解析并翻译成嵌套的环境结构(例如 .HIVE$db = an environment, .HIVE$db$user = "Horst", .HIVE$db$pw = "my password", .HIVE$regex$ date = 一些日期的正则表达式等)

我已经构建了可以处理这些嵌套环境的例程(例如,查找值“db/user”或“regex/date”,更改它等)。问题是配置文件的初始解析需要很长时间,并且会产生相当大的对象(实际上是三到四个,在 4 到 16 MB 之间)。所以我想“没问题,让我们通过将对象保存到 .Rdata 文件来缓存它们”。这行得通,但是“加载”缓存的对象使我的 Rterm 进程在 RAM 消耗(超过 1 GB !!)方面达到顶峰,我仍然不明白为什么(这 当我重新“计算”对象时发生,但这正是我试图避免的,因为它需要太长时间)。

我已经考虑过序列化它,但我还没有测试它,因为我需要重构我的代码。另外,我不确定它是否会以与加载 .Rdata 文件相同的方式影响“加载回 R”部分。

问题

谁能告诉我为什么加载以前计算的对象会对我的 Rterm 进程的内存消耗产生如此大的影响(与在我启动的每个新进程中计算它相比)以及如何最好地避免这种情况?

如果需要,我也会尝试提出一个示例,但重现我的确切场景有点棘手。不过我会试试的。

【问题讨论】:

  • 尝试重现一个玩具示例可能会告诉您为什么会发生这种情况。至少这对我来说是这样的。

标签: performance r caching memory


【解决方案1】:

这很可能是因为您创建的环境承载着它们的祖先。如果您不需要祖先信息,则将此类环境的父级设置为 emptyenv()(或者如果您不需要它们,则不要使用环境)。

还要注意,公式(当然还有函数)也有环境,所以也要注意这些环境。

【讨论】:

  • +1 这是一个深刻的见解。有什么方法可以发现这一点 - 只需从parent.env() 中寻找除 R_EmptyEnv 之外的任何东西?我有兴趣检查我自己的环境中是否有任何可疑之处。 FWIW,我注意到 ?environment 报告 The replacement function 'parent.env<-' is extremely dangerous...(请参阅帮助以获取完整警告)并且可能会被删除。
  • 这听起来很可能。 +1 指向 emptyenv() 的用途。
  • 谢谢,这可能真的是问题的一部分,因为我懒得总是包含parent=emptyenv() 语句。一旦我尝试过,我会回来更多
  • @Iterator,仅当您存储环境(或包含环境的对象)时,才真正适用于父级切换。如果您只是使用环境,那么祖先通常不会成为问题。
【解决方案2】:

如果别人无法重现,那就很难回答了。但是,我所做的事情与您正在做的事情非常相似,但我使用 JSON 文件来存储我的所有值。我没有解析文本,而是使用 RJSONIO 将所有内容转换为列表,从列表中获取内容非常容易。 (如果需要,您可以转换为哈希,但最好有多层嵌套参数。)

请参阅this answer,了解我是如何做这种事情的示例。如果这对您有用,那么您可以放弃昂贵的翻译步骤和内存膨胀。

(对原始问题进行尝试...)我想知道您的问题是否是您使用的是环境而不是列表。在某些情况下,保存环境可能会很棘手。保存列表没问题。尝试使用列表或尝试转换到/从环境。您可以为此使用as.list()as.environment() 函数。

【讨论】:

  • 感谢您的指点。也考虑过 JSON 对象。最初,我使用的是列表,但从概念的角度来看,我更喜欢这方面的环境,因为它们完美地映射了您在目录树设置(即 Windows 资源管理器)中存储文件的方式,确保没有重复文件(这可能会发生)很容易在列表中)。另外,我发现使用环境扩展/剪切现有的嵌套结构比使用列表要容易得多,但这也可能只是因为没有以最聪明的方式进行;-)
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 2011-05-10
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多