Ignite использует всю память и завершает работу с OutOfMemory при переборе кеша - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь перебрать все объекты кеша, используя ScanQuery и итератор (чтобы не вытащить их сразу из распределенного кеша на локальный клиент):

IgniteCache cache = ignite.getOrCreateCache("test2");
ScanQuery<Integer, Person> scan = new ScanQuery<>();
scan.setPageSize(256);
Iterator<Cache.Entry<Integer, Person>> it = cache.query(scan).iterator();
int id;
while(it.hasNext()) {
    id = it.next().getValue().getId();
    <...>
}

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

    IgniteCache cache = ignite.getOrCreateCache("test2");
    Iterator<Cache.Entry<Integer, Person>> it = cache.iterator();
    int id;
    while(it.hasNext()) {
        id = it.next().getValue().getId();
        <...>
    }

Документы утверждают, что:

QueryCursor представляет набор результатов запроса и допускает прозрачную постраничную итерацию. Всякий раз, когда пользователь начинает перебирать последнюю страницу, он автоматически запрашивает следующую страницу в фоновом режиме.

Так почему происходит сбой зажигания локального узла при переборе кеша с помощью ScanQuery?

UPD:

  1. Персона - это пример имени, а не фактического имени класса. Фактический класс содержит одно поле типа Integer и 10 строк.
  2. На самом деле я уже установил размер страницы на меньшее число - 256 вместо значения по умолчанию 1024. Такое же поведение с значением по умолчанию и меньшим значением
  3. Когда я пытаюсь использовать cache.query(scan).getAll(), все идет по-другому, но я не могу использовать значение итератора в цикле while, приложение просто зависло до OOM.
  4. Сообщение об исключении:

    31 августа 2018 г. 18:16:15 org.apache.ignite.logger.java.JavaLogger error SEVERE: ошибка времени выполнения, обнаруженная во время выполнения, выполняемого сеткой: считыватель сокетов [id = 105, name = tcp-disco-sock-reader- # 13, nodeId = 83e986dc-9fc1-433c- 8953-2a11460376a0] java.lang.OutOfMemoryError: пространство кучи Java

полная трассировка стека: https://pastebin.com/raw/ZpHnRjx8

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

похоже на известную проблему https://issues.apache.org/jira/browse/IGNITE-8892 Это уже исправлено и будет доступно в Apache Ignite 2.7. Можете ли вы проверить свой код с последней master веткой?

0 голосов
/ 03 сентября 2018

Я также испытывал такое поведение с ScanQuery; кажется, что в курсоре произошла утечка памяти, где он содержит ссылки на итерированные объекты кэша. В качестве обходного пути вы можете использовать интерфейс SqlQuery, который не демонстрирует такое же поведение, при условии, что ваши кэши настроены для доступа SQL:

SqlQuery<Integer, Person> scan = new SqlQuery<>(Person.class, "1=1");
...