Нужна Слабая Карта (а, б) -> с

У меня есть запомненный fn, где fn запоминается двумя входными ссылками:

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 получает мусор, курсор также должен быть мусором.

refToHash еще одна запоминающаяся функция, использующая ES6 WeakMap так что увиденные ссылки все еще разрешены для GC.

NewRefCursor запоминать гораздо сложнее, потому что он использует два параметра для определения попадания в кеш, поэтому не совместим с WeakMap, таким образом, предотвратит любое обращение к GC'у. Я открыт для любого способа обмана, прикрепления частных полей к входным объектам, вероятностных структур данных. Эта утечка должна быть решена. Единственное решение, которое у меня есть, - это добавить параметр для создания памятки, который ограничивает размер кэша, и настроить этот параметр для каждого приложения. валовой.

2 ответа

Решение

Если вы создаете двухуровневую слабую карту (сохраняете слабые карты на слабых картах), всякий раз, когда ставится цель на первом уровне, вы теряете весь второй уровень (когда a Это ты проиграл 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-уровня. Это решит вашу проблему или я что-то упустил?

См. Памятку в https://github.com/Dans-labs/dariah/blob/master/client/src/js/lib/utils.js Он решает проблему в общем виде путем создания индекса WeakMap для всех аргументов, которые объекты. Индекс WeakMap присваивает объектам уникальные целые числа, которые затем могут быть объединены с другими аргументами с помощью stringify.

Другие вопросы по тегам