2014-04-09 3 views
1

Ниже моя тестовая программа для тестирования производительности при удалении ребер в Titan:Titan увеличивает производительность при удалении ребра

 
     Vertex v1 = g.addVertex(null); 

     int i = 0; 
     long lastTime = System.currentTimeMillis(); 
     while (true) { 
      Vertex v2 = g.addVertex(null); 

      Iterable iterable = v1.getEdges(Direction.IN, "last-data"); 
      for(Edge e : iterable) { 
       e.remove(); 
      } 

      v2.addEdge("last-data", v1); 

      g.commit(); 

      if (i % 100 == 0) { 
       long duration = (System.currentTimeMillis() - lastTime); 
       System.out.println("count:" + String.format("%7s", i) + ", duration:" + String.format("%7s", duration) + "ms"); 
       lastTime = System.currentTimeMillis(); 
      } // end if 
      i++; 
     } // end while 

В течение долгого времени, время, необходимое для удаления край становится все длиннее и длиннее, хотя число краев остается 1 все время.

Это ошибка? Не следует ли время, затраченное на удаление края, постоянным, так как число ребер всегда равно 1? Что вызывает такое поведение? В любом случае обходной путь?

+0

который бэкэнд вы используете? Cassandra? –

+0

Да, я использую cassandra 2.0.4 в качестве внутреннего хранилища. это кассандра, вызывающая эту проблему? –

ответ

0

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

Ваш код добавляет ребра к одной существующей вершине, то есть v1 (и вновь созданной вершине в каждом цикле) и удаляет ее, удаляя край с v1. Это означает, что по мере того, как количество удаленных ребер растет до уплотнения, вы вынуждены читать данные надгробия, чтобы добраться до последнего добавленного края.

Помимо выполнения уплотнения, одним из вариантов является удаление края с противоположного направления (т. Е. От v2) или удаление края по его идентификатору. Эти методы заставили меня преодолеть эти проблемы. Учитывая, что ваш код конкретно, при условии, что был в реальном мире проблема, где вы быстро добавление/удаление ребер из supernode, то некоторая форма вершины-ориентированных запроса может помочь ... как:

v1.query().limit(1).edges() 

Это мог бы исправить ваш «тестовый код», хотя вам придется просто попробовать и посмотреть. Этот подход работает для меня (вы можете просто вставить в Titan Gremlin РЕПЛ):

g = TitanFactory.open('conf/titan-cassandra.properties') 

v1 = g.addVertex(null) 

bytes = new byte[ 65536 ] 
Arrays.fill(bytes, (byte) 0) 

i = 0; 
lastTime = System.currentTimeMillis(); 
toRemove = null 
while (true) { 
    def v2 = g.addVertex(null); 
    v2.setProperty('b',bytes) 

    if (toRemove != null) toRemove.remove() 

    toRemove = v2.addEdge("last-data", v1); 

    g.commit(); 

    if (i % 100 == 0) { 
     def duration = (System.currentTimeMillis() - lastTime); 
     println "count:" + String.format("%7s", i) + ", duration:" + String.format("%7s", duration) + "ms" 
     lastTime = System.currentTimeMillis(); 
    } // end if 
    i++; 
} 
+0

Интересно .... я случайно оставил ваши программы запущенными случайно. добрался до краев 3М с небольшим количеством деградации. Сорта странная. во всяком случае, мой ответ по-прежнему стоит, как я видел это поведение раньше. –

+0

3M края? Вы имеете в виду петли 3M? coz i удаляет края каждого цикла, поэтому должно быть 1 край (как вы сказали с точки зрения графика) в любое время.Я работаю на рабочем столе i7, я вижу эффект деградации почти сразу (менее 10000 циклов). –

+0

Я попробовал 'v1.query(). Limit (1) .edges();', не помогает. Это не 'v1.getEdges (Direction.IN," last-data ");' то же, что и 'v1.query(). Direction (Direction.IN) .labels (" last-data ") .edges(); 'который является вершинным запросом? –

0

Деградация можно ускорить делает setProperty на каждом v2 создан, следующим образом:

byte[] bytes = new byte[ 65536 ]; 
    Arrays.fill(bytes, (byte) 0); 

    Vertex v1 = g.addVertex(null); 
    Edge pE = null; 

    int i = 0; 
    long lastTime = System.currentTimeMillis(); 
    while (true) { 
     Vertex v2 = g.addVertex(null); 
     v2.setProperty("chunk", bytes); 

     if (pE != null) { 
      pE.remove(); 
     } 

     pE = v2.addEdge("last-data", v1); 

     g.commit(); 

     if (i % 1000 == 0) { 
      long duration = (System.currentTimeMillis() - lastTime); 
      System.out.println("count:" + String.format("%7s", i) + ", duration:" + String.format("%7s", duration) + "ms"); 
      lastTime = System.currentTimeMillis(); 
     } // end if 
     i++; 
    } // end while 

и даже если я сохраню предыдущий край pE, производительность будет расти, но медленнее (менее 50000 циклов).

+0

Эй, Мелвин, пожалуйста, поделитесь результатами своего теста, чтобы все знали, в каких номерах мы говорим. Вот мой для 5000 циклов: http://dpaste.com/1776449/ –

+0

Привет, Даниэль и Стивен.Я пробовал титан с беркелей, встроенной кассандрой и удаленной кассандрой. Результаты [здесь] (https://github.com/yammelvin/TitanTestsRepository/tree/master/TitanTestProgram/log) вместе с моей тестовой программой. Кажется, что производительность поднимается как на встроенную, так и на удаленную кассандру, но не на berkeleyje. –

0

Очень вероятно, что ухудшение характеристик связано с накоплением надгробных камней, которые отмечают удаление ранее добавленных ребер. Они очищаются только после следующего уплотнения. Вот почему вы видите удар производительности на Cassandra и, тем более, на BerkeleyJe (который имеет дело с удалением по-разному).

Есть некоторые варианты настройки, чтобы повысить производительность для таких случаев использования, но в принципе это поведение не исчезнет. Мы работаем над поддержкой маркеров времени для прожига по краям, которые позволят вам указать время истечения для краев, которое было бы более масштабируемым способом борьбы с удалениями в таком контексте, если это применимо.

+0

Если это так, то после уплотнения производительность не должна возвращаться к норме, но до сих пор я заметил, что производительность продолжает снижаться. В любом случае, спасибо. –

+0

OK Я просто понимаю из степеней, что уплотнение является административной функцией. Я думал, что это периодическая функция времени исполнения. –

Смежные вопросы