我想使用memoize
,但我担心缓存会无限增长,直到发生悲伤时间。缺省lodash memoize函数是否会造成内存泄漏?
我通过google/stackoverflow搜索找不到任何东西。
P.S.我正在使用lodash v4。
我想使用memoize
,但我担心缓存会无限增长,直到发生悲伤时间。缺省lodash memoize函数是否会造成内存泄漏?
我通过google/stackoverflow搜索找不到任何东西。
P.S.我正在使用lodash v4。
简短回答是肯定的,lodash保留所有memoized数据,除非你指定不同的缓存类型。
默认的缓存是lodash的MapCache:
https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1968
的memoized值存储在根据密钥是否适合哈希(不同的数据结构和ES6地图是否是在可用环境):
https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1987 https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L5561
如果你看一下这些数据结构的“设置”的方法,你会发现没有provisi对像LRU等什么:
哈希#集:https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1832
ListCache#集:https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1940
地图#集:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set
简短的回答是否定的。
当您使用memoize
功能,用户已接受合同:
所以只有永久保存数据的实现才能符合要求。
什么是经常混淆 - 是一个“内存泄漏”的事情,只是“低效”使用内存。
在这种情况下 - 如果这对您是个问题,那么您有责任在适合您的算法时重新创建memoized函数。因为只有你知道什么时候这样做是安全的,而且不能自动完成。
它不会:它完全按照预期工作。如果你想“刷新”缓存 - 只需重新创建一个包装函数。这是因为你故意自愿存储所有数据。 – zerkms
您也可以使用WeakMap作为您的缓存,如果它对您可用,并且您按对象键入。 – chardy