Почему я получаю исключение OutOfMemoryException при использовании TinkerPop? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть XML -файл с примерно 1 миллионами вершин и ребер. Я хочу загрузить их на сервер Gremlin, но после примерно 200 000 узлов я получаю исключение OUTOfMemoryException на сервере Gremlin. Я пробовал 2 разных способа

GraphTraversal<Vertex, Vertex> verttmp = g.addV(mapprop.get(LABEL)).property(T.id, keyid);
verttmp.next();

и с Клиентом

client.submit(query);

Есть ли безопасный способ работы с таким количеством узлов?

1 Ответ

1 голос
/ 08 мая 2020

Я предполагаю, что вы получите это OutOfMemoryException на сервере Gremlin. По умолчанию сервер Gremlin настроен на -Xmx4096m, что может быть недостаточным для размера загружаемого вами графика (особенно, если вы используете TinkerGraph, который является чистым графом в памяти). Вам просто нужно увеличить размер -Xmx на вашем gremlin-server. sh файле , пока у вас не будет достаточно памяти для хранения вашего графика. Возможно, начните с удвоения до 8192m, но, учитывая, что вы прошли только 20% своей нагрузки, я бы удивился, достаточно ли удвоения.

В качестве примечания, если вы выбрасываете значение verttmp.next() (т.е. в вашем примере кода оно выглядит так же, как и вы), то было бы лучше сделать:

g.addV(mapprop.get(LABEL)).property(T.id, keyid).iterate()

Это будет значительно дешевле, так как вы не будете тратить время на возврат результатов, которые нужно было бы сериализовать и отправить по сети. Кроме того, если вы отправляете сценарии (т.е. где «запрос» - это String), то я вижу, что вы не параметризуете свои запросы . Это убийца производительности, и я могу представить, что в результате требования к памяти будут намного выше, чем необходимо, что приведет к увеличению OutOfMemoryException намного раньше, чем следовало бы. Либо измените свой код, чтобы использовать параметры, либо просто сделать запросы на основе байт-кода с удаленным обходом:

GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using("localhost",8182,"g"));

Я бы посоветовал вам использовать подход байт-кода, который избавляет вас от необходимости параметризации, и позвольте вам написать свой Gremlin как код а не встроенные строки.

...