私はmemoize
を使いたいですが、悲しい時が来るまでキャッシュが無期限に成長するという懸念があります。デフォルトのlodash memoize関数はメモリリークの危険にさらされていますか?
google/stackoverflow検索で何も見つかりませんでした。
P.S.私はlodash v4を使用しています。
私はmemoize
を使いたいですが、悲しい時が来るまでキャッシュが無期限に成長するという懸念があります。デフォルトのlodash memoize関数はメモリリークの危険にさらされていますか?
google/stackoverflow検索で何も見つかりませんでした。
P.S.私はlodash v4を使用しています。
簡単な答えは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
短い答えはノーです。
あなたがmemoize
機能を使用するときは、契約の受け入れ:
したがって、データを永遠に保持する実装だけが要件を満たすことができます。
非常に混乱しているのは、メモリを単に「非効率的」に使用する「メモリリーク」のことです。
この場合、問題が発生した場合は、アルゴリズムに適したメモメモ機能を再作成する必要があります。それが安全であることを知っているのはあなただけなので、自動的に行うことはできません。
良い答えもあまりにも、私はちょうどメモリリークという用語を悪用したと思う。私の心配は実際には記憶の過消費です。ここで気づいている意味のわずかな違いがあると思います。ありがとう – ctrlplusb
最後に私は 'reselect'というライブラリを使ってアプリケーションの状態の変化に反応しました(私はreact/reduxを使用しています)。そしてmemoized関数を出力します。私はこれがあなたが示唆しているものと一致していると思います。私は関数に複数の引数を使用しているので、私自身のmemoizeリゾルバも用意しなければなりませんでした。ユニットテストは機能しています。ありがとう! – ctrlplusb
それはそうではありません。意図したとおりに動作します。キャッシュを "フラッシュ"する場合は、ラップされた関数を再作成してください。すべてのデータを意図的かつ自発的に保存しているため、ほとんど漏れはありません。 – zerkms
WeakMapをキャッシュとして使用することもできます。利用可能な場合は、オブジェクトごとにキー入力しています。 – chardy