GridGain Off Heap не работает

Может, кто-нибудь быстро взглянет, что не так с моим кодом, который должен хранить кеш в памяти вне кучи через GridGain?

Моя конфигурация такая же, как на вики-странице (http://doc.gridgain.org/latest/Off-Heap+Memory)

Моя конфигурация следующая:

<!-- Enable OffHeap -->
<property name="offHeapMaxMemory" value="#{2L * 1024L * 1024L * 1024L}"/>

<!-- Always store cache entries in off-heap memory, evict to Swap. -->
<property name="memoryMode" value="OFFHEAP_TIERED"/>

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

Код следующий:

final GridCache<String, Object> cache = grid.cache("partitioned");
for (long i = 0; i < 1000; i++) {
    cache.putx(String.valueOf(i), hundredBytes.clone());

    if (i % 1024 * 1024 == 0) {
        System.out.println(i + "bytes inserted");
    }
}

System.out.println("Cache size: " + cache.size());

Последняя строка показывает мне «Размер кеша: 0». Странно, наверное, я не совсем понимаю, как получить доступ к Off Heap memory. Есть ли для этого другой/отдельный API?

заранее спасибо


person Dr.Khu    schedule 22.09.2014    source источник


Ответы (2)


Правильно, есть еще один API

GridCache<String, Object> cache = grid.cache("partitioned");
Iterator<Map.Entry<String, Object>> localIterator = cache.offHeapIterator();

Однако обратите внимание, что 'grid.cache("partitioned")' в случае хранения данных в куче возвращает кеш для всего кластера, а 'cache.offHeapIterator()' в случае хранения данных вне кучи возвращает только данные для локальный узел в кластере.

Это меня немного смутило.

person Dr.Khu    schedule 22.09.2014

Есть несколько моментов о разнице в куче и вне кучи:

  • Нет никакой разницы между хранилищем данных в куче и вне кучи, когда вы обращаетесь к своим данным по ключу: grid.cache("partitioned") по-прежнему работает с кешем всего кластера, а не только с локальными записями. Вы можете получить доступ к своим данным по ключу, используя методы cache.get(...) независимо от узла, на котором вы выполняете свой код.
  • Существуют разные методы, которые возвращают локальный размер памяти в куче и вне кучи. cache.size() возвращает количество записей в куче, хранящихся в кеше. cache.offHeapEntriesCount() возвращает количество записей, хранящихся в хранилище вне кучи. cache.swapKeys() возвращает количество записей, хранящихся в свопе.
  • Итераторы записей для on-heap, off-heap и swap всегда возвращают локальные записи для узла. Если вам нужна целая итерация кеша, вы можете использовать запрос сканирования или транслировать закрытие, которое будет выполнять итерацию по локальным записям.
person Alexey    schedule 23.09.2014
comment
Спасибо, Алексей, за ответ, однако я вижу еще одну ситуацию на gridgain 6.2.1. cache.offHeapEntriesCount() говорит мне, что в коллекции есть данные, и я могу получить доступ к этим данным, используя offHeapIterator. Однако при попытке доступа к данным с помощью 'int[] partitions = cache.affinity().primaryPartitions(grid.localNode());' не возвращает данные. Но когда я отключаю Off Heap, последний код работает - person Dr.Khu; 23.09.2014