1

メモ化された fn があります。ここで、fn は 2 つの入力参照によってメモ化されています。

let NewRefCursor = memoized(
    (deref, swap) => refToHash(deref) + refToHash(swap), // memoizer identity fn
    (deref, swap) => new RefCursor(deref, swap)); // the function we are memoizing

私が必要とする行動はNewRefCursor(a, b) === NewRefCursor(a, b). aまたはbがガベージ コレクションされると、カーソルもガベージ コレクションされる必要があります。

refToHashES6WeakMapを使用するもう 1 つのメモ化された関数で、参照が引き続き GC に許可されるようにします。

NewRefCursorキャッシュ ヒットを決定するために 2 つのパラメーターを使用するため、メモ化するのが非常に難しく、 と互換性がなくWeakMap、参照が GC されるのを防ぐことができます。私は、入力オブジェクトにプライベート フィールドを追加したり、確率的なデータ構造を作成したりするなど、あらゆる種類の策略を受け入れます。このリークは解決する必要があります。私がこれまでに持っている唯一の解決策は、キャッシュ サイズを制限するパラメーターを memoize に追加し、そのパラメーターをアプリごとに調整することです。全体。

4

2 に答える 2

3

2 レベルのウィークマップを作成する (weakmaps にウィークマップを保存する) 場合、最初のレベルの obj が gced になるたびに、2 番目のレベル全体が失われます (aが gced の場合は失われますb)。bが gced の場合、別のペア ( 、何か)aがある場合にのみ存在する のウィークマップがまだあります。a最良の実装ではありませんが、それで十分だと思います:

function BiWeakMap() {
    this._map = new WeakMap();
}

BiWeakMap.prototype.set = function(key1, key2, value) {

    if (!this._map.has(key1)) {
        this._map.set(key1, new WeakMap());
    }

    this._map.get(key1).set(key2, value);

    return this;

};

BiWeakMap.prototype.has = function(key1, key2) {

    return this._map.has(key1) && this._map.get(key1).has(key2);

};

BiWeakMap.prototype.get = function(key1, key2) {

    return this._map.get(key1) && this._map.get(key1).get(key2);

};

この概念は、n レベルのソリューションに拡張できます。これで問題は解決しますか、それとも何か不足していますか?

于 2015-12-29T13:52:02.297 に答える