0

TitanOrientDB、およびNeo4jの 3 つの異なるグラフ データベースのベンチマークを試みています。データベース作成の実行時間を測定したい。テスト ケースとして、このデータセットhttp://snap.stanford.edu/data/web-flickr.htmlを使用します。データはローカルに保存されており、コンピューターのメモリには保存されていませんが、大量のメモリが消費され、残念ながらしばらくするとEclipseがクラッシュすることに気付きました。なぜこうなった?

ここにいくつかのコード スニペットがあります: Titan グラフの作成

public long createGraphDB(String datasetRoot, TitanGraph titanGraph) {
    long duration;
    long startTime = System.nanoTime();
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(datasetRoot)));
        String line;
        int lineCounter = 1;
        while((line = reader.readLine()) != null) {
            if(lineCounter > 4) {
                String[] parts = line.split(" ");
                Vertex srcVertex = titanGraph.addVertex(null);
                srcVertex.setProperty( "nodeId", parts[0] );
                Vertex dstVertex = titanGraph.addVertex(null);
                dstVertex.setProperty( "nodeId", parts[1] );
                Edge edge = titanGraph.addEdge(null, srcVertex, dstVertex, "similar");
                titanGraph.commit();
            }
            lineCounter++;
        }
        reader.close();
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
    catch( Exception e ) {    
        titanGraph.rollback();
    }
    long endTime = System.nanoTime();
    duration = endTime - startTime;
    return duration;
}

OrientDB グラフの作成:

public long createGraphDB(String datasetRoot, OrientGraph orientGraph) {
    long duration;
    long startTime = System.nanoTime();
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(datasetRoot)));
        String line;
        int lineCounter = 1;    
        while((line = reader.readLine()) != null) {
            if(lineCounter > 4) {
                String[] parts = line.split(" ");
                Vertex srcVertex = orientGraph.addVertex(null);
                srcVertex.setProperty( "nodeId", parts[0] );
                Vertex dstVertex = orientGraph.addVertex(null);
                dstVertex.setProperty( "nodeId", parts[1] );
                Edge edge = orientGraph.addEdge(null, srcVertex, dstVertex, "similar");
                orientGraph.commit();
            }
            lineCounter++;
        }
        reader.close();
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
    catch( Exception e ) {    
        orientGraph.rollback();
    }
    long endTime = System.nanoTime();
    duration = endTime - startTime;
    return duration;

Neo4j グラフの作成:

public long createDB(String datasetRoot, GraphDatabaseService neo4jGraph) {
    long duration;
    long startTime = System.nanoTime(); 
    Transaction tx = neo4jGraph.beginTx();
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(datasetRoot)));
        String line;
        int lineCounter = 1;
        while((line = reader.readLine()) != null) {
            if(lineCounter > 4) {
                String[] parts = line.split(" ");
                Node srcNode = neo4jGraph.createNode();
                srcNode.setProperty("nodeId", parts[0]);
                Node dstNode = neo4jGraph.createNode();
                dstNode.setProperty("nodeId", parts[1]);
                Relationship relationship = srcNode.createRelationshipTo(dstNode, RelTypes.SIMILAR);
            }
            lineCounter++;
        }
        tx.success();
        reader.close();
    } 
    catch (IOException e) {
        e.printStackTrace();
    }
    finally {
        tx.finish();
    }
    long endTime = System.nanoTime();
    duration = endTime - startTime;
    return duration;
}

編集: BatchGraph ソリューションを試しましたが、永久に実行されるようです。それは昨日一晩中実行され、最後にはなりませんでした。私はそれを止めなければなりませんでした。私のコードに何か問題がありますか?

TitanGraph graph = TitanFactory.open("data/titan");
    BatchGraph<TitanGraph> batchGraph = new BatchGraph<TitanGraph>(graph, VertexIDType.STRING, 1000);
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("data/flickrEdges.txt")));
        String line;
        int lineCounter = 1;
        while((line = reader.readLine()) != null) {
            if(lineCounter > 4) {
                String[] parts = line.split(" ");
                Vertex srcVertex = batchGraph.getVertex(parts[0]);
                if(srcVertex == null) {
                    srcVertex = batchGraph.addVertex(parts[0]);
                }
                Vertex dstVertex = batchGraph.getVertex(parts[1]);
                if(dstVertex == null) {
                    dstVertex = batchGraph.addVertex(parts[1]);
                }
                Edge edge = batchGraph.addEdge(null, srcVertex, dstVertex, "similar");
                batchGraph.commit();
            }
            lineCounter++;
        }
        reader.close();
    }
4

3 に答える 3

2
于 2013-11-12T08:12:28.260 に答える
1

複数のデータベースを比較しようとしているので、コードをブループリントに一般化することをお勧めします。Flickr データセットは、 BatchGraphグラフ ラッパーなどに適したサイズのようです。これによりBatchGraph、コミット サイズを調整し、コードに集中して読み込みを管理できます。このようにして、1 つの単純なクラスで異なるすべてのグラフをロードできます (テストを他のブループリント対応のグラフに簡単に拡張することもできます)。

-Xmx@Stefanはメモリについて良い点を指摘しています...そのデータを処理するには、JVMの設定を強化する必要があるでしょう。各グラフは (ディスクに永続化されていても) 異なる方法でメモリを処理し、3 つすべてを同じ JVM に一度にロードしている場合、どこかに何らかの競合があるに違いありません。

参照した Flickr データセットよりも大きくすることを計画している場合は、BatchGraph正しくない可能性があります。BatchGraph一般に、数億のグラフ要素に適しています。それよりも大きなグラフについて話し始めると、グラフ固有ではないということについて私が言ったことのいくつかを忘れたくなるかもしれません。テストするグラフごとに、ジョブに最適なツールを使用することをお勧めします。Neo4j の場合、それはNeo4jBatchGraphを意味し(少なくとも、それが重要な場合はまだブループリントを使用しています)、Titan の場合はFaunusま​​たはカスタム作成された並列バッチ ローダーを意味し、OrientDB OrientBatchGraphの場合は

于 2013-11-12T14:00:45.073 に答える
1

OrientDBを使用すると、このインポートを次の 2 つの方法で最適化できます。

  1. カスタム拡張機能の使用と
  2. トランザクションをまったく使用しないでください

したがって、OrientGraph の代わりに OrientGraphNoTx を使用してグラフを開き、次のスニペットを試してください。

OrientVertex srcVertex = orientGraph.addVertex(null, "nodeId", parts[0] );
OrientVertex dstVertex = orientGraph.addVertex(null, "nodeId", parts[1] );
Edge edge = orientGraph.addEdge(null, srcVertex, dstVertex, "similar");

.commit() を呼び出さずに。

于 2013-11-12T20:59:34.300 に答える