Nano Hash - криптовалюты, майнинг, программирование

Может ли CacheBuilder заменить MapMaker в моем случае?

Мне нужно получить результат медленного метода slowResult() для экземпляров класса Something. Кэширование само по себе не помогает, поскольку экземпляры почти никогда не повторяются. К счастью, я знаю, что результат на самом деле зависит только от некоторых легко получаемых Attributes из Something, поэтому я мог бы использовать Map<Attributes, Result> в качестве кэша в коде

Result fastResult(Something something) {
    final Attributes attributes = attributesFor(something)
    Result result = cache.get(attributes);
    if (result!=null) return result;
    result = something.slowResult();
    cache.put(attributes, result);
    return result;
}

Чтобы ограничить кеш, я использовал устаревшие методы maximumSize и expireAfterAccess. Устаревание происходит из-за того, что вместо него будет использоваться новый класс CacheBuilder. Однако я не нашел хорошего способа применить его к моему делу. Ключи кеша должны быть экземплярами Attributes, но при загрузке кеша требуется экземпляр Something, и нет простого способа воссоздать его из Attributes.

Есть ли хорошее решение этой проблемы?

30.09.2011

Ответы:


1

Ну, один из способов сформулировать эту проблему: «Как я могу сравнить Attributes.equals() для кеша, но при этом иметь доступ к Something для создания значения». Так что, думаю, это может сработать...

class SomethingKey {
  private Something something;
  private final Attributes attributes;
  SomethingKey(Something s) {
    this.something = s;
    this.attributes = attributesFor(something);
  }
  public Result createResult() {
    Something something = this.s;
    this.s = null;
    return something.slowResult();
  }
  public boolean equals(Object o) {
    if(o==this) return true;
    if(o==null || o.getClass() != this.getClass) return false;
    SomethingKey that = (SomethingKey)o;
    return this.attributes.equals(that.attributes);
  }
}

И тогда CacheLoader.load в основном

Result load(SomethingKey k) {
   return k.createResult();
}

И карта будет

Cache<SomethingKey,Result> map = ...;

Конечно, недостатком является то, что вы создаете новый SomethingKey для каждого запроса, но...

02.10.2011
  • В моем случае это нормально из-за огромной стоимости звонка slowResult. Если бы Something был огромным объектом, это тоже было бы проблемой. 02.10.2011

  • 2

    Очень интересно! Я не думаю, что мы когда-либо слышали о таком случае.

    Для 11.0 вы сможете сделать cache.asMap().put(), так что, вероятно, будет нормально пока просто игнорировать предупреждения об устаревании. Мы рассматриваем возможность возможно включить это в выпуске патча 10.1, потому что несколько пользователей, похоже, находятся в одной лодке.

    Но в 11.0 другая идея, которую мы обсуждаем, позволит вам сделать это:

    Result fastResult(final Something something) {
      return cache.get(
          attributesFor(something),
          new Callable<Result>() {
            public Result call() {
              return something.slowResult();
            }
          });
    }
    
    01.10.2011
  • При использовании cache.asMap().put необходимо также сначала проверить contains, что для меня нормально. Два аргумента put выглядят лучше. На самом деле идеальным решением для меня было бы Cache.get2(K key, A attributes), где key и attributes использовались бы для поиска и передавались загрузчику соответственно. Таким образом, параметр первого типа CacheLoader может отличаться от типа ключа. Но я не думаю, что он будет использоваться достаточно часто. 02.10.2011

  • 3

    Можете ли вы вместо этого просто отключить кэш от чего-то?

    30.09.2011
  • Нет... как я писал результат зависит на самом деле только от некоторых легко получаемых Attributes из Something. Всякий раз, когда Attributes совпадают, мне нужно вернуть один и тот же Result, кэширование Something не помогает, поскольку оно (в отличие от Attributes, полученного из него) почти никогда не повторяется. 01.10.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..