3

私は最近 Neo4J を使い始めましたが、これまでのところ、特にサーバーで発生している問題に対する答えを見つけることができませんでした。私はバージョン 1.8.1 を使用しており、組み込みではなく Windows でサーバーをサービスとして実行しています。私が持っているグラフには、約 7m のノードと約 11m の関係があります。

小さなクエリとその倍数で、うまく動作します。ただし、より複雑なクエリ (場合によっては数千行) を取り戻そうとすると、事態は悪化します。コンソールを使用している場合、何も表示されず、数分以上経過すると undefined という単語が表示されます (Javascript で何かをしようとしていますが、何をするのかわかりません)。.NET で Neo4JClient を使用している場合、タイムアウトになり (WCF サービスを介してこれを処理しています)、問題はサーバー側にあると思われます。

コンソールで問題を引き起こした暗号クエリの例を次に示します。

start begin = node:idx(ID="1234")
MATCH begin-[r1?:RELATED_TO]-n1-[r2?:RELATED_TO]-n2-[r3?:RELATED_TO]-n3-[r4?:RELATED_TO]-n4
RETURN begin.Title?, r1.RelationType?, n1.Title?, r2.RelationType?, n2.Title?, r3.RelationType?, n3.Title?, r4.RelationType?, n4.Title?;

ログを調べたところ、次の重大なエラーが発生しています。

SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuffer.append(Unknown Source)
    at java.io.StringWriter.write(Unknown Source)
    at java.io.PrintWriter.newLine(Unknown Source)
    at java.io.PrintWriter.println(Unknown Source)
    at java.io.PrintWriter.println(Unknown Source)
    at org.neo4j.cypher.PipeExecutionResult$$anonfun$dumpToString$1.apply(PipeExecutionResult.scala:96)
    at org.neo4j.cypher.PipeExecutionResult$$anonfun$dumpToString$1.apply(PipeExecutionResult.scala:96)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:45)
    at org.neo4j.cypher.PipeExecutionResult.dumpToString(PipeExecutionResult.scala:96)
    at org.neo4j.cypher.PipeExecutionResult.dumpToString(PipeExecutionResult.scala:124)
    at org.neo4j.cypher.javacompat.ExecutionResult.toString(ExecutionResult.java:90)
    at org.neo4j.shell.kernel.apps.Start.exec(Start.java:72)
    at org.neo4j.shell.kernel.apps.ReadOnlyGraphDatabaseApp.execute(ReadOnlyGraphDatabaseApp.java:32)
    at org.neo4j.shell.impl.AbstractAppServer.interpretLine(AbstractAppServer.java:127)
    at org.neo4j.shell.kernel.GraphDatabaseShellServer.interpretLine(GraphDatabaseShellServer.java:92)
    at org.neo4j.shell.impl.AbstractClient.evaluate(AbstractClient.java:130)
    at org.neo4j.shell.impl.AbstractClient.evaluate(AbstractClient.java:114)
    at org.neo4j.server.webadmin.rest.ShellSession.evaluate(ShellSession.java:96)
    at org.neo4j.server.webadmin.rest.ConsoleService.exec(ConsoleService.java:123)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)

スタック トレースを見て経験に基づいた推測の観点からすると、あまりにも多くのレコードを引き戻しているのでしょうか? StringBuffer の展開中にメモリが不足しているため。

GCがその役割を果たしているのではないかと思っていたので、GCViewerを手に入れました。ガベージ コレクションではないようです。役に立つと思われる場合は、GCViewer のスクリーンショットを追加できます。

デフォルト値と 8G のメモリの間の任意の場所に JVM を割り当てました。ここに私の構成ファイルからの私の設定のいくつかがあります (私は関連するものだけを含めようとします)。さらに必要な場合はお知らせください。

Neo4J.properties

# Default values for the low-level graph engine
use_memory_mapped_buffers=false

# Keep logical logs, helps debugging but uses more disk space, enabled for legacy reasons
keep_logical_logs=true

Neo4J-server.properties

# HTTP logging is disabled. HTTP logging can be enabled by setting this property to 'true'.
org.neo4j.server.http.log.enabled=false 

Neo4J-Wrapper.conf (不慣れに一緒に挿入された可能性があります)

# Uncomment the following line to enable garbage collection logging
wrapper.java.additional.4=-Xloggc:data/log/neo4j-gc.log

# Setting a different Garbage Collector as recommended by Neo4J
wrapper.java.additional.5=-XX:+UseConcMarkSweepGC

# other beneficial settings that should boost performance
wrapper.java.additional.6=-d64
wrapper.java.additional.7=-server
wrapper.java.additional.8=-Xss1024k

# Initial Java Heap Size (in MB)
wrapper.java.initmemory=1024

# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=8000

どんな助けでも感謝します。

4

2 に答える 2

3

クエリが複雑すぎます。グラフが非常に大きく、ヒープ メモリの制限に達しないことが確実でない場合は、適切なメモリを割り当てる必要があります。この構成で少し遊んでみたいと思うかもしれません: io examples

ただし、クエリは次のように簡略化できます。

start begin = node:idx(ID="1234")
MATCH p=begin-[r1:RELATED_TO*0..4]-n4
RETURN p
于 2013-02-14T09:19:36.537 に答える
1

Craig 問題は、Neo4j-Shell を使用することです。これは単なる ops ツールであり、送信する前にメモリ内のデータを収集するだけであり、巨大な結果セットを処理するためのものではありませんでした。

おそらく、ストリーミングが有効になっている http エンドポイント ( http-header ) に対してクエリを直接実行したいX-Stream:true場合は、もう問題ありません。

于 2014-07-30T09:34:52.883 に答える