Я использую следующий код, чтобы найти кратчайший путь между двумя узлами:
Iterable<Object> spath = orientGraph.getRawGraph().command(new OSQLSynchQuery<Object>(
"select shortestPath("+v1.getId()+","+v2.getId()+",'BOTH')"));
Моя проблема в том, что мне нужно слишком много времени. В моем графе 36 692 вершины и 367 662 ребра, и на запрос требуется примерно 2 минуты. Я использую ориентдб-1.6.2. Моя машина имеет процессор 2,3 ГГц (i5), 4 ГБ ОЗУ и диск на 320 ГБ, и я работаю на Macintosh OSX Mavericks (10.9).
Обратите внимание, что я не использую какую-либо специальную конфигурацию для своей БД. Я просто открываю его следующим кодом:
orientGraph = new OrientGraph("plocal:"+orientDBDir);
Также мой размер кучи составляет 2 ГБ.
Есть ли способ ускорить процедуру с точки зрения скорости?
РЕДАКТИРОВАТЬ: я пытаюсь распечатать результаты со следующим кодом
System.out.println(spath.iterator().next());
После некоторого теста я понял, что строка spate.iterator().next() замедляет процедуру. Почему это?
#-2:0{shortestPath:[2]} v0
. Нет никакой функции с именем getIdentity() - person salvador   schedule 17.01.2014Exception in thread "OrientDB MemoryWatchDog" Error: java.lang.OutOfMemoryError: Java heap space
- person salvador   schedule 17.01.2014explain select shortestPath(#9:0,#9:1,'BOTH')
- person salvador   schedule 18.01.2014Profiled command '{optimizationElapsed:0,elapsed:109165.39,resultType:collection,resultSize:1}' in 109.167000 sec(s):
{"@type":"d","@version":0,"optimizationElapsed":0,"elapsed":109165.39,"resultType":"collection","resultSize":1,"@fieldTypes":"optimizationElapsed=l,elapsed=f"}
- person salvador   schedule 18.01.2014