CacheService.putAll игнорирует ключи над определенным значением - PullRequest
0 голосов
/ 27 декабря 2018

У меня проблема с методом putAll () кэша Google для скрипта.Кажется, что метод работает, но только с первыми (~ 100) парами

В моем скрипте мне нужно кэшировать большое количество строк (~ 2500 * 3), каждая строка в другом ключе, и я обнаружил неисправность в службе кэширования.Чтобы выявить проблему, я написал простой код

function myFunction() {
  var cache = CacheService.getScriptCache();
  var toCache = {};
  for (var i = 0; i < 2000; i++){
   toCache["key"+i] = "value"+i;
  }
  cache.putAll(toCache);
  var tmp;
  for (var i = 0; i < 2000; i+=10){
   var a = cache.get("key"+i);
   if (a == null) { tmp = "key"+i; break; }
  }

  tmp = tmp;
}

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

Спасибо

1 Ответ

0 голосов
/ 28 декабря 2018

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

В вашей ситуации, когда i равно 100, a возвращает null.На этом цикл for заканчивается.При использовании следующего сценария обнаруживается, что в CacheService имеется более 100 свойств.

var cache = CacheService.getScriptCache();
var toCache = {};
var keys = [];
for (var i = 0; i < 2000; i++) {
  var key = "key" + i;
  keys.push(key);
  toCache[key] = "value" + i;
}
cache.putAll(toCache);
var r = cache.getAll(keys);

Logger.log(keys.length) // 2000
Logger.log(Object.keys(r).length) // 900

Но также обнаружено, что, хотя 2000 свойств отправляются, извлекается только 900 свойств.И я не смог найти закономерности утраченных свойств.Исходя из этого результата, я подумал, что может быть максимальное количество свойств, которые можно выдвинуть.

Эксперимент:

В качестве эксперимента я исследовал количество найденных свойств с увеличениемколичество заданных свойств.Каждое свойство было сдвинуто сразу.На следующем рисунке показан результат.

enter image description here

На этом рисунке для приведенного выше сценария установлено, что 900 свойств - это максимальное количество свойств, которые могут бытьтолкнул сразу.Это не зависело от размера значений менее 100 кБайт.Также можно получить следующие баллы:

  • При нажатии на свойства от 1 до 900 все свойства могут быть восстановлены правильно.
  • Когда отправлено 1000 свойств, извлекается 1-900 свойств.Свойства после 900 не могут быть восстановлены.Считается, что эти свойства не передаются.
  • Когда 2000 свойств передаются, извлекается 900 свойств.Но я не смог найти их закономерность.
  • После того, как 900 свойств были переданы с использованием имен ключей «keyA1, keyA2, keyA3 ,,,», когда 100 свойств были переданы с использованием имен ключей «keyB1, keyB2», keyB3 ,,, ", 1000 свойств могут быть правильно восстановлены.
    • Но после того, как 900 свойств были переданы с использованием имен ключей "keyA1, keyA2, keyA3 ,,,", когда 101 свойство передано с использованием имен ключей "keyB1, keyB2, keyB3 ,,,", только 900 свойствполученыВ этом случае свойства «keyA» были перезаписаны 101 свойством «keyB».

Эти результаты были такими же, как у CacheService.getScriptCache(), CacheService.getUserCache() и CacheService.getDocumentCache().Но каждый метод CacheService.getScriptCache(), CacheService.getUserCache() и CacheService.getDocumentCache() может использоваться как отдельное хранилище.Таким образом, когда используются 3 метода, можно использовать 3000 свойств.

Сводка:

  1. Максимальное количество свойств, которые можно нажать один раз, равно 900.
  2. Когдадобавлены свойства 100 свойств после того, как 900 свойств были переданы, 1000 свойств могут быть сохранены.
    • Считается, что это максимальное число.
  3. Методы CacheService.getScriptCache(), CacheService.getUserCache() и CacheService.getDocumentCache() независимы.
    • При использовании CacheService.getScriptCache(), CacheService.getUserCache() и CacheService.getDocumentCache() можно использовать 3000 свойств.

Обходной путь:

Из приведенных выше результатов, когда вы нажимаете свойства "~ 2500 * 3", как насчет следующего обходного пути?

Я думаю, что свойства "~ 2500 * 3" могут быть переданы в CacheService с помощью комбинацииЭти.

Примечание:

  • При использовании CacheService.getDocumentCache(), пожалуйста, используйте связанный с контейнером сценарий.
  • В этом отчете я подтвердил свой аккаунт.Я не уверен, что все результаты других пользователей одинаковы.Я извиняюсь за эту ситуацию.

Ссылка:

Если вышеуказанные результаты уже былисообщили и / или это было не то, что вы хотите, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...