2015-08-20 7 views
1

J'ai migré avec succès le jeu de données dblp dans la base de données neo4j et j'utilise neo4jShell pour exécuter les requêtes chiffrées. La base de données a des millions de nœuds et des relations entre les publications et les auteurs. Maintenant, lorsque je tente d'exécuter une requête sur la base de données de Neo4j il faut 10 à 12 heures pour le traitement, puis a fini avec cette erreurBase de données graphique Neo4j java.lang.OutOfMemoryError: espace de tas Java. Base de données graphique Neo4j

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

J'utilise Neo4j version édition communautaire 2.2.3, Machine jdk 1.7 avec 8 gb de la mémoire et du processeur Core i7.

Requête:

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

experts s'il vous plaît me conseiller un moyen de sortir de cette exception.

+0

Sons comme Neo4j n'est pas un bon ajustement. Ce serait un problème trivial pour une base de données relationnelle. Les bases de données d'objets ont un sens pour les graphiques d'objets profonds. Cela ne semble pas être le cas ici. – duffymo

+1

Dupliquer de [Comment définir l'utilisation maximale de la mémoire pour JVM?] (Http://stackoverflow.com/questions/1493913/how-to-set-the-maximum-memory-usage-for-jvm) – l4mpi

+0

Essayez de réécrire votre requête. Exemple: 'MATCH (a: auteur) AVEC LIMIT 25 MATCH (p: publication) - [p: publishedby] -> (a) RETURN p.year, p.type, a.id ORDER BY a.id desc'. En utilisant l'instruction 'WITH'. – FylmTM

Répondre

1

Comme votre jeu de données est un jeu de données public, il serait très utile que vous partagiez votre base de données.

En général, vous calculez plusieurs millions ou milliards de chemins que vous cumulez après coup, cela prend juste un certain temps. Combiné avec probablement une mémoire insuffisante et un disque lent, le chargement des données à partir du disque prend beaucoup de temps.

Ceci est une requête graphique globale, vous pouvez voir que si vous l'exécutez préfixé avec PROFILE.

Assurez-vous que votre propriété id est numérotée!

je changerais la requête comme ceci:

// 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; 

Pour démarrer Neo4j-shell avec des paramètres de mémoire sensibles:

  • arrêter le serveur
  • modifier conf/Neo4j-wrapper.conf, définir min et maxmemory à 4000
  • modifier conf/neo4j.properties définir dbms.pagecache.memory = 3G
  • début le serveur, exécutez bin/Neo4j-shell

si vous exécutez Neo4j-shell en mode autonome, arrêtez le serveur et utiliser ceci:

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

Merci bro, cette requête fonctionne en quelques secondes. –

1

Vous devriez probablement définir plus de mémoire max pour votre processus java. Le processus Java n'utilise que la quantité maximale de mémoire configurée, par défaut, il est habituellement de 256 Mo seulement. Utilisez le paramètre -Xmx pour y parvenir. Lisez ceci How to set the maximum memory usage for JVM? pour avoir une explication plus détaillée. Sachez que vous devez utiliser un système d'exploitation 64 bits jdk et 64 bits pour définir Xmx sur plus de 4 Go.

+1

Veuillez marquer la question comme un doublon au lieu de répondre avec un lien vers une autre question SO ... – l4mpi

+0

Je montre une solution et j'ajoute quelques conseils. Je ne pense pas que ma réponse soit mauvaise. Peut-être devrais-je marquer la question comme un doublon, mais il y a aussi des solutions du côté de Neo4j donc ce n'est pas exactement un doublon. S'il vous plaît reconsidérer votre downvote. –

+0

Votre avis, bien que valide, devrait être un commentaire et non une réponse; combiné avec un drapeau en double. Et vous avez raison de dire que la requête Neo4j d'OP est probablement loin d'être optimisée, mais comme votre réponse ne traite pas de cela, elle n'est pas pertinente. Je suis très opposé à l'alimentation de personnes qui apparemment ne peuvent pas être dérangées pour rechercher tel que OP (il y a d'innombrables ressources sur SO et en dehors de cela décrivant ce qu'est un OutOfMemoryError et comment il peut être traité), et votre réponse ne N'ajoute rien d'important qui ne peut pas être trouvé sur SO déjà, d'où le downvote. – l4mpi