В текущей архитектуре памяти (Apache Ignite 2.x, см. эта ссылка ) вы не можете выбрать только память в куче.
Данные всегда хранятся в выключенном состоянии.-heap.Он будет извлечен (хотя и не полностью) в кучу для выполнения всех видов обработки.Например, в то время как JOIN
и WHERE
SQL-запроса в основном могут выполняться прямо в куче, окончательный набор результатов должен быть извлечен в кучу.
В вашем случае вывыделять больше памяти для воспламенения, чем у вас есть.Вы выделяете 12 ГБ вне кучи + 15 ГБ кучи = 27 ГБ, что, очевидно, больше, чем ваша 16 ГБ ОЗУ.
В общем случае вы должны выделять достаточно памяти для хранения необходимых вам данных (+ индексы и накладные расходы!)на куче, и вы можете дать остальное в кучу.Вы также должны оставить немного оперативной памяти для системных нужд.Но при включенном постоянстве вы можете иметь даже больше данных, чем память вне кучи, но имейте в виду, что если ваши данные не помещаются в область данных вне кучи, производительность будет снижаться.
Кстати,удалите ваш pageEvictionMode
- он не имеет смысла, когда постоянство включено (да, документация не может это подчеркнуть).
Наконец, если вы получите OutOfMemory
для пространства кучи, это, вероятно, означает, что ваш SQLнабор результатов слишком велик.Чтобы обойти это, вы можете либо
- уменьшить набор результатов, разбив ваш SQL-запрос на несколько, возвращая меньше данных
- увеличить размер кучи
- использовать
SqlFieldsQuery.setLazy(true)
- с этим флагом Ignite попытается разбить результирующий набор на куски, если это возможно, и загрузить их в кучу один за другим