我已经构建了一个可以通过配置文件自定义的软件。配置文件被解析并转换为嵌套环境结构(例如.HIVE $ db =环境,.HIVE $ db $ user =“Horst”,。HIVE $ db $ pw =“我的密码”,.HIVE $ regex $ date =日期等的一些正则表达式。)
我已经构建了可以处理那些嵌套环境的例程(例如,查找值“db / user”或“regex / date”,更改它等)。问题是配置文件的初始解析需要很长时间并导致相当大的对象(实际上是三到四个,在4到16 MB之间)。所以我想“没问题,让我们通过将对象保存到.Rdata文件来缓存它们”。这是有效的,但“加载”缓存的对象使我的Rterm进程在RAM消耗(超过1 GB !!)方面有所提升,我仍然不明白为什么(这不当我全部“重新计算”对象时发生,但这正是我想要避免的,因为它需要太长时间)。
我已经考虑过将序列化,但我还没有测试过,因为我需要稍微重构一下代码。另外,我不确定它是否会影响“加载回R”部分,就像加载.Rdata文件一样。
有人能告诉我为什么加载一个先前计算过的对象会对我的Rterm进程的内存消耗产生这样的影响(与我开始的每个新进程中计算它相比)以及如何最好地避免这种情况?
如果需要,我也会尝试提出一个例子,但重现我的确切场景有点棘手。但我会试试。
答案 0 :(得分:8)
这很可能是因为你正在创造的环境带着他们的祖先。如果您不需要祖先信息,请将此类环境的父级设置为emptyenv()
(或者如果您不需要环境,则不要使用环境)。
另请注意,公式(当然还有函数)都有环境,所以也要注意这些。
答案 1 :(得分:3)
如果其他人无法复制,则很难回答。但是,我做了一些与您正在做的事情非常相似的事情,但我使用JSON文件来存储我的所有值。我使用RJSONIO将所有内容转换为列表,而不是解析文本,从列表中获取内容非常简单。 (如果需要,你可以转换为哈希值,但是拥有嵌套参数层会很好。)
请参阅this answer,了解我是如何做到这一点的。如果这对您有用,那么您可以放弃昂贵的翻译步骤和内存膨胀。
(对原始问题进行了尝试......)我想知道你的问题是你使用的是环境而不是列表。在某些情况下,保存环境可能会非常棘手。保存列表没问题。尝试使用列表或尝试转换为/从环境转换。您可以使用as.list()
和as.environment()
函数。