Ошибка кучи Orientdb Java

#orientdb #graph-databases #orientdb-2.1 #orientdb2.2

#orientdb #графические базы данных #orientdb-2.1 #orientdb2.2

Вопрос:

Я провел тест на Orientdb 2.2.10, используя транснациональный граф

Со следующим кодом Sudo в однопоточной системе

    for(i = 1 to 1000)
{
    DB_Name = getRandomString()

    createGraphDb(DB_Name ) using OServerAdmin : if db do not exist
    gFactory = OrientGraphFactory(DB_Name ) : if db exist


    graph = OrientGraphFactory.getTx()
    previousEvent = null

    for(j=1 to 1000)
      {
        currentEvent = getrandomString()
        if(previousEvent and currentEvent != null)
              {
                   - create Vertex named currentVertex and edges between them 
                   - (from previous to current event)
              }
        else
              {
                    create vertex named current event 
              }
         previousEvent = currentEvent
      }
   graph.shutdown()

}
  

Я получил следующее исключение после нескольких итераций моего внешнего цикла.

 Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.lang.String.substring(Unknown Source)
at java.lang.String.split(Unknown Source)
at java.lang.String.split(Unknown Source)
at com.orientechnologies.orient.core.config.OStorageConfiguration.fromStream(OStorageConfiguration.java:268)
at com.orientechnologies.orient.core.config.OStorageConfiguration.fromStream(OStorageConfiguration.java:497)
at com.orientechnologies.orient.core.config.OStorageConfiguration.load(OStorageConfiguration.java:207)
at com.orientechnologies.orient.client.remote.OStorageRemote.open(OStorageRemote.java:330)
at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.open(ODatabaseDocumentTx.java:257)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool$DatabaseDocumentTxPooled.internalOpen(OPartitionedDatabasePool.java:445)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool.openDatabase(OPartitionedDatabasePool.java:308)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool.acquire(OPartitionedDatabasePool.java:263)
at com.tinkerpop.blueprints.impls.orient.OrientBaseGraph.<init>(OrientBaseGraph.java:144)
at com.tinkerpop.blueprints.impls.orient.OrientTransactionalGraph.<init>(OrientTransactionalGraph.java:78)
at com.tinkerpop.blueprints.impls.orient.OrientGraph.<init>(OrientGraph.java:135)
at com.tinkerpop.blueprints.impls.orient.OrientGraphFactory.getTx(OrientGraphFactory.java:119)
  

Есть ли у них какие-либо проблемы с моим кодом sudo или с OrientDB.

Если у них есть какой-либо лучший способ, пожалуйста, предложите.

Спасибо ..!

Комментарии:

1. Мой размер кучи — xmx512m. Какой подходящий размер кучи для такого приложения?

Ответ №1:

Сколько гигабайт оперативной памяти у вас есть в наличии? Например, если вы можете назначить процессу Java максимум 8 ГБ, обычно лучше назначить небольшую кучу и большой буфер дискового кэша (память вне кучи). Поэтому вместо:

java -Xmx8g ...

Вместо этого вы могли бы попробовать это:

java -Xmx800m -Dstorage.diskCache.bufferSize=7200 ...

Для получения дополнительной информации вы можете прочитать страницу, касающуюся настройки производительности, в официальной документации.

Надеюсь, это поможет.

Комментарии:

1. Сервер orientdb также работает на JVM. Я имею в виду, что моя база данных работает на удаленном компьютере. Итак, вы говорите о настройке JVM моей системы (в которой запущена моя Java-программа) или удаленной системы, в которой работает orientdb.

2. Может ли проблема с памятью кучи Java также возникать на моем удаленном компьютере, на котором orientdb «server.sh » запущен, я спрашиваю об этом, потому что мой терминал, в котором запущен orient, показывает это ->>>>>> » Ошибка при выполнении запроса java.lang. Ошибка OutOfMemoryError: пространство кучи Java »

Ответ №2:

Вы можете проверить использование кучи с помощью -XX: PrintGC -XX: PrintGCDateStamps -XX: PrintGCDetails -XX: PrintGCTimeStamps -XX: PrintTenuringDistribution -Xloggc:$ORIENTDB_HOME/log/gc_%p_%t.войдите на сервер (можно добавить последний флаг XX только для расследования о продвижении сот нового к старому).

Вы можете добавить аналогичные настройки на своем клиенте (измените только параметр gc.log). Я только что запустил класс Java (8u102 на Mac, с 16 ГБ и i7) на основе вашего псевдокода, но запустил 1 цикл (1 дб) с 1000 вершинами ребрами, и он успешно выполнил задание без OutOfMemory

Пока, Клаудио

Комментарии:

1. Предоставленный размер кучи составляет 512m

Ответ №3:

В OrientDB транзакции сохраняют изменения в оперативной памяти, поэтому, если у вас есть транзакции с сотнями тысяч элементов, это может вызвать эту проблему. Я предлагаю вам зафиксировать все X элементов. Я предлагаю начать с 1000, а затем настроить его на основе результата.

Комментарии:

1. после каждой внутренней итерации (для цикла) я фиксирую фиксацию db. graph.shutdown перед завершением работы экземпляра graph.

2. Привет, я протестировал клиентскую java (8u102) с 10 циклами, и я не видел никакой ошибки ООМ, работающей в течение 72 минут. Сервер запустил только полный сбор данных, с номером базы данных 7, с 700 вершинами (0,2 секунды для полного, 0,5 секунды для приложения), но медленно просуществовал еще 30 минут, до 10 ДБ; размер процесса увеличился на 7,8 ГБ (и 485,2% процессора) Клиентский процесс не был огромным (менее 2 ГБ), запрашивал низкий процент процессора и запускал FullGC (0,6 с) только один или два раза для каждой БД, поэтому вам нужно больше максимальной кучи на сервере (попробуйте 1 ГБ) и много оперативной памяти (протестировано с 16 ГБ ОЗУ и i7 на OSX) Claudio

3. Можно добавить, что сервер по умолчанию использовал максимальную кучу 512 МБ, а клиент — максимальную кучу 4 ГБ, но он использовал менее 1,5 ГБ

4. не могли бы вы ответить на это>>>> Сервер orientdb также работает на JVM. Я имею в виду, что моя база данных работает на удаленном компьютере. Итак, вы говорите о настройке JVM моей системы (в которой запущена моя Java-программа) или удаленной системы, в которой работает orientdb

5. Может ли проблема с памятью кучи Java также возникать на моем удаленном компьютере, на котором orientdb «server.sh » запущен, я спрашиваю об этом, потому что мой терминал, в котором запущен orient, показывает это ->>>>>> » Ошибка при выполнении запроса java.lang. Ошибка OutOfMemoryError: пространство кучи Java »