2013-03-11 2 views
2

У меня есть немного путаницы в отношении управления памятью.Когда релиз памяти Neo4j?

Я использую neo4j во встроенном режиме в Java-приложении. Версия - 1.8.1. Версия JVM - 1.6

У меня есть однопоточный загрузчик с петлей для цикла, который содержит вложенный цикл. Внутри внешнего цикла я делаю graphDb.beginTx();, получаю идентификатор тестового объекта из mysql и создаю для него узел. Во внутреннем цикле for я запрашиваю mysql, чтобы получить кучу связанных объектов. Я создаю для них узлы и соответствующую связь с узлом, который я создал во внешнем цикле.

В конце внешней петли, я делаю tx.success() и tx.finish().

for (int x = 0; x < 10000000; x++) { 
    Transaction tx = graphDb.beginTx(); 
    Node n = graphDb.createNode(); 
    Long id = n.getId(); 
    System.out.println("ID: " + id); 
    n.setProperty("TestId", x); 
    * * * get the mysql ids * * * * 
    for (int y = 0; y < mysqlidlist; y++) { 
     Node n1 = graphDb.createNode(); 
     Long id2 = n1.getId(); 
     n1.setProperty("InnerTestId", y); 
     Relationship rel = n.createRelationshipTo(n1, NodeRelation.ATTRIBUTE); 
     rel.setProperty("Weight", 0.3); 
    } 
    tx.success(); 
    tx.finish(); 
    tx = null; 
} 

На основании моих показаний, я подумал, что Neo4j затем освободить память, которая захваченная транзакции. Тем не менее, я вижу, что использование памяти постоянно увеличивается, и через некоторое время она попадает в настройку Xmx. Я проконсультирую его, чтобы убедиться, что утечек нет. Я устанавливаю все остальные переменные в нуль в конце, и это должно помочь GC использовать его лучше.

Я не прав в своем понимании? Если да, то в чем рекомендуемая передовая практика управления памятью?

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

Большое спасибо!

С уважением,

Сэчин

+0

Можете ли вы показать код? – TizianoPiccardi

+0

yep .... код. – user2158600

+0

да .... код ... \t \t для (INT х = 0, х <10000000; х ++) \t \t { \t \t \t Transaction Тх = graphDb.beginTx(); \t \t \t Узел n = graphDb.createNode(); \t \t \t Длинный идентификатор = n.getId(); \t \t \t System.out.println ("ID:" + id); \t \t \t n.setProperty ("TestId", x); \t \t \t *** Получить MySQL Идентификаторы **** \t \t \t для (INT у = 0; у user2158600

ответ

0

Вы можете попробовать отключить кэширование (использование cache_type = нет). docs.neo4j.org/chunked/milestone/configuration-caches.html

+0

Спасибо большое Wes. Попробует попробовать. – user2158600

+0

Wes - Я отключил кеш, и это определенно помогает в достижении предела Xmx. И мой следующий вопрос будет, если это можно отключить и динамически? В настоящее время я делаю это с самого начала. Большое спасибо! – user2158600

+0

Возможно, вам придется повторно инициализировать GraphDatabase, чтобы изменить его - не уверен. Может быть, один из парней Neo может прокомментировать. –

1

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

http://docs.neo4j.org/chunked/milestone/batchinsert.html


Или, не рекомендуется: Если вы хотите использовать фрагмент кода добавить что-то вроде: если (у% 1000 == 0) {tx.success(); tx.finish()} внутри цикла for для фиксации и освобождения памяти, используемой каждый n вставки, но это будет медленнее

+0

Я согласен, что партия была бы хорошей; но я читал, что не рекомендуется использовать многопоточным образом. И мы будем строить нашу инфраструктуру, чтобы быть более многопоточными. И да, я пытался сделать успех через определенные промежутки времени, и это действительно помогает, но я думаю, что neo4j все еще много кэширует и не выпускает его. Я пытался, что Wes рекомендовал отключить кеш, и это определенно помогает в достижении предела Xmx. И мой следующий вопрос будет, если это можно отключить и динамически? В настоящее время я делаю это с самого начала. – user2158600

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