2015-08-20 2 views
1

Я успешно перенесла dblp dataset в базу данных neo4j, и я использую neo4jShell для запуска запросов cypher. База данных содержит миллионы узлов и отношений между публикациями и авторами. Теперь, когда я пытаюсь выполнить запрос на базе Neo4j это занимает от 10 до 12 часов для обработки, а затем в конечном итоге с этой ошибкойБаза данных диаграмм Neo4j java.lang.OutOfMemoryError: Java куча пространства. База данных диаграммы Neo4j

Error occurred in server thread; nested exception is : java.lang.OutOfMemoryError: Java heap space

я использую Neo4j Community Edition версии 2.2.3, JDK 1.7 машина с 8 ГБ памяти и процессор Core i7.

Запрос:

neo4j-sh (?)$ MATCH (p:`publication`)-[:`publishedby`]->(a:`author`) 
RETURN p.year, p.type, a.id, count(*) order by a.id desc LIMIT 25; 

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

+0

Похоже Neo4j не очень подходит. Это будет тривиальной проблемой для реляционной базы данных. Базы данных объектов имеют смысл для графиков глубоких объектов. Это не похоже на случай здесь. – duffymo

+1

Дубликат [Как установить максимальное использование памяти для JVM?] (Http://stackoverflow.com/questions/1493913/how-to-set-the-maximum-memory-usage-for-jvm) – l4mpi

+0

Попробуйте переписать Ваш запрос. Пример: 'MATCH (a: author) С МАСШТАБОМ LIMIT 25 (p: публикация) - [p: publishedby] -> (a) RETURN p.year, p.type, a.id ORDER BY a.id desc'. Использование оператора 'WITH'. – FylmTM

ответ

1

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

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

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

Убедитесь, что ваше id свойство numic!

Я хотел бы изменить запрос следующим образом:

// this is the expensive operation, to order millions of authors by id 
// still, do it and take the top 25 
MATCH (a:author) WITH a order by a.id LIMIT 25 
// find publications for the top 25 authors 
MATCH (a)<-[:publishedby]-(p) 
// return aggregation 
RETURN a.id, p.year, p.type, count(*) 
LIMIT 25; 

Для начала Neo4j-оболочки с разумными настройками памяти:

  • остановить сервер
  • редактировать конф/Neo4j-wrapper.conf, set min и maxmemory до 4000
  • изменить conf/neo4j.properties установить dbms.pagecache.memory = 3G
  • start сервер, запустить бен/Neo4j-оболочки

, если вы запустите Neo4j-оболочку в автономном режиме, остановите сервер и использовать это:

export JAVA_OPTS="-Xmx4000M -Xms4000M -Xmn1000M" 
bin/neo4j-shell -path data/graph.db -config conf/neo4j.properties 
+0

Спасибо, этот запрос работает в считанные секунды. –

1

Возможно, вы должны установить больше максимальной памяти в свой Java-процесс. Процесс Java использует только максимальную сконфигурированную сумму памяти, по умолчанию она составляет всего 256 МБ. Для достижения этого используйте параметр -Xmx. Прочтите это How to set the maximum memory usage for JVM?, чтобы получить более подробное объяснение.

Помните, что вы должны использовать 64-битную jdk и 64-разрядную ОС для установки Xmx более чем на 4 ГБ.

+1

Пожалуйста, отметьте вопрос как дубликат, а не ответьте на него ссылкой на другой вопрос SO ... – l4mpi

+0

Я указываю на решение и добавление некоторых советов. Я не думаю, что мой ответ плох. Возможно, я должен отметить этот вопрос как дубликат, но на стороне Neo4j также есть решения, поэтому это не совсем дубликат. Пожалуйста, пересмотреть ваш downvote. –

+0

IMO Ваш совет, хотя он действителен, должен быть комментарием, а не ответом; в сочетании с двойным флагом. И вы правы, что запрос OPs Neo4j, вероятно, далеко не оптимизирован, но поскольку ваш ответ не имеет отношения к этому, это не имеет значения. Я очень против ложного кормления людей, которые, по-видимому, не могут быть обеспокоены поисками, такими как OP (на SO есть бесчисленные ресурсы и вне его, описывающие, что такое OutOfMemoryError и как с ним можно справиться), и ваш ответ Не добавляйте ничего важного, которое нельзя найти на SO уже, следовательно, downvote. – l4mpi

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