2016-07-26 1 views
6

私はmemoizeを使いたいですが、悲しい時が来るまでキャッシュが無期限に成長するという懸念があります。デフォルトのlodash memoize関数はメモリリークの危険にさらされていますか?

google/stackoverflow検索で何も見つかりませんでした。

P.S.私はlodash v4を使用しています。

+0

それはそうではありません。意図したとおりに動作します。キャッシュを "フラッシュ"する場合は、ラップされた関数を再作成してください。すべてのデータを意図的かつ自発的に保存しているため、ほとんど漏れはありません。 – zerkms

+1

WeakMapをキャッシュとして使用することもできます。利用可能な場合は、オブジェクトごとにキー入力しています。 – chardy

答えて

3

簡単な答えはyesです。あなたが別のキャッシュタイプを指定しない限り、lodashはすべてのメモデータを保持します。


デフォルトのキャッシュはlodashのMapCacheにある: https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1968

メモ化値
は、キー(ハッシュ化に適しているかどうかに応じて異なるデータ構造に格納され、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

+0

LRUはメモの全体概念を破り、契約を破ることになります。 – zerkms

+1

高価なレンダリング出力をキャッシュする便利な方法として、私は過去にLRU( "max"オプション)でmemoizeeを使用しました。その特定のアプリケーションでは、機能に入力を一致させるバッチを取得していましたが、時間の経過とともに入力が変化します。キャッシュミスはメモリを噛んでいないより重要ではなかった。 – chardy

+0

私はこれを受け入れましたが、私はメモリリーク期間を逃したかもしれませんが、この答えは私が探していたものの中心にあります。 – ctrlplusb

4

短い答えはノーです。

あなたがmemoize機能を使用するときは、契約の受け入れ:

  1. 機能のみキャッシュがある限り、それは#1を保証するために必要だとして、そこにとどまる与えられた引数
  2. で一度呼び出されますが(永遠)

したがって、データを永遠に保持する実装だけが要件を満たすことができます。

非常に混乱しているのは、メモリを単に「非効率的」に使用する「メモリリーク」のことです。

この場合、問題が発生した場合は、アルゴリズムに適したメモメモ機能を再作成する必要があります。それが安全であることを知っているのはあなただけなので、自動的に行うことはできません。

+0

良い答えもあまりにも、私はちょうどメモリリークという用語を悪用したと思う。私の心配は実際には記憶の過消費です。ここで気づいている意味のわずかな違いがあると思います。ありがとう – ctrlplusb

+1

最後に私は 'reselect'というライブラリを使ってアプリケーションの状態の変化に反応しました(私はreact/reduxを使用しています)。そしてmemoized関数を出力します。私はこれがあなたが示唆しているものと一致していると思います。私は関数に複数の引数を使用しているので、私自身のmemoizeリゾルバも用意しなければなりませんでした。ユニットテストは機能しています。ありがとう! – ctrlplusb

関連する問題