#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 »