2016-02-29 3 views
0

У меня есть большая таблица (много столбцов и несколько строк) в моей схеме OrientDB.Управление памятью по запросу

(колонны ранних 35.000, ряды ранних 100.000).

Когда я пытаюсь запросить мою таблицу с простым COUNT, как это:

SELECT COUNT(@rid) FROM myTable WHERE filters 

Моего процесс занимает ранний 8 ГБ оперативной памяти.

Если я пытаюсь переписать мой запрос, используя индекс обозначения, например:

SELECT COUNT(@rid) FROM index:myIndex WHERE key = [value1, ... valueN] 

Мой процесс занимает ранний 8 ГБ оперативной памяти.

Первый вопрос:

я зарезервировал для Orient 8 Гб оперативной памяти для сервера приложений, я должен резервировать ту же память? Потому что с помощью свойства DISK CACHE для Orient, управления памятью для него, это нормально, но под сервером приложений (Tomcat) у меня возникает ошибка «Из памяти».

Второй вопрос:

Почему простой COUNT занимает все те памяти? Существует stretgy о pagination, зависящем от номера столбцов?

+0

Извините, я не понял некоторые моменты: 1) у вас есть 35 000 столбцов, вы имеете в виду, что у вас есть класс с 35 000 полей? 2) Вы используете Tomcat и OrientDB одновременно? 3) какую версию OrientDB вы используете? – lsavio

+0

1) Да 35 000 столбцов, не отображаемых в классе POJO, отображаются только некоторые поля. 2) Tomcat для приложения для развертывания переднего конца, а OrientDB - сервер БД. 3) Как я отметил мой вопрос 2.1 (более конкретно, 2.1.4) –

ответ

1

Попробуйте начать дб ориентируют без Tomcat, и убедиться в этом:

SET INDEX

Используя индекс полей, используемых для фильтрации данных в запросе, это приведет к улучшению. В OrientDB существуют различные типы индексов, каждый из которых обеспечивает преимущества в определенных ситуациях index. Поэтому выбор индекса зависит от вашей ситуации. В моих тестах я использовал «SB-TREE».

enter image description here

ПРОВЕРКИ RAM OCCUPATED BY ORIENTDB ПРОЦЕСС

С настройками по умолчанию (OrientDB автонастройки DISKCACHE = 5.064MB (куча = 455MB), загрузив 100000 вершин класса Person с 3-мя свойствами (идентификатор , название, город), у меня есть следующие значения памяти:

  • Размер дБ = 80 MB
  • Запрос = SELECT COUNT(@rid) FROM Person WHERE id >= 0
  • Время выполнения запроса = (холодно) 3.57 сек. (горячий) 1,88 с.
  • Проверьте запрос, который использовался index = explain SELECT COUNT(@rid) FROM Person WHERE id >= 0, и проверьте, что под столбцом «involvedIndexes» есть индекс, который вы создали (в моем случае [«Person.ID "])
  • процесс OrientDB (со студией открытой) = 442 МБ (команда: п.с. -ef | Grep сориентировать вы получаете idprocess, то: верхняя -pYOUR_ID)

Время запроса: enter image description here

использование индекс: enter image description here

RAM используется процесс orientdb в enter image description here

УВЕЛИЧЕНИЕ КУЧА/DISKCACHE

, если у вас есть "из памяти", вы можете попытаться увеличить кучу:

  • открыть файл Server.sh (для Linux) или сервера. bat (для окон) в папке/bin на вашем местоположении orientdb.
  • Set MAXHEAP = -Xmx2048m

, если ваш запрос по-прежнему медленно после использования индексов увеличивает кэш:

  • MAXDISKCACHE = "- Dstorage.diskCache.bufferSize = 8192 ДЛЯ 8GB"

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

Без запуска Tomcat у вас все еще «не хватает памяти», или count() вернет значения (достаточно быстро)?

Если до сих пор все прошло хорошо, вы можете запустить Tomcat и посмотреть, как он ведет оперативную память с активными 2 процессами (oriendb и tomcat). Если он не является насыщенным, попробуйте повторно запустить запрос с помощью count(). Получите «из памяти»? С активным tomcat вы должны попытаться переустановить память, чтобы этого было достаточно для Tomcat и для OrientDB. (Кроме того, учитывая RAM, используемый ОС).

EDIT

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

+0

Если у меня несколько фильтров, и я их создаю во время выполнения, как добавить индекс для моего использования? Пример: я проверяю фильтр программы по имени и фамилии, но в следующий раз я проверю фильтр на дату рождения и место жительства.Я должен добавить и удалить всегда индекс перед запуском запроса? –

+0

Я обновил предыдущий ответ. – lsavio

+0

Спасибо, дорогой, но я могу выбрать фильтр на каждом столбце (35 000). Я попытался добавить во время работы фильтры, но время для строительства очень длинное –