天天看點

NEO4J億級資料全文索引建構優化

NEO4J億級資料全文索引建構優化

  • 一、資料量規模(億級)
  • 二、建構索引的方式
  • 三、建構索引發生的異常
  • 四、全文索引代碼優化
    • 1、Java.lang.OutOfMemoryError
    • 2、通路資料庫時
    • 3、優化方案
    • 4、優化代碼
    • 5、執行效率測試
如果使用基于NEO4J的全文檢索作為圖譜的主要入口,那麼做好圖譜搜尋引擎的優化是非常關鍵的。

count(relationships):500584016

count(nodes):765485810

使用腳本後伺服器台執行建構全文索引的操作。

使用背景腳本執行建構索引程式:

index.sh
#!/usr/bin/env bash
nohup /neo4j-community-3.4.9/bin/neo4j-shell -file build.cql >>indexGraph.log 2>&1 &
           
build.cql
CALL zdr.index.addChineseFulltextIndex('IKAnalyzer', ['description','fullname','name','lnkurl'], 'LinkedinID') YIELD message RETURN message;
           

ERROR (-v for expanded information):
    TransactionFailureException: The database has encountered a critical error, and needs to be restarted. Please see database logs for more details.

-host      Domain name or IP of host to connect to (default: localhost)

-port      Port of host to connect to (default: 1337)

-name      RMI name, i.e. rmi://<host>:<port>/<name> (default: shell)

-pid       Process ID to connect to

-c         Command line to execute. After executing it the shell exits

-file      File containing commands to execute, or '-' to read from stdin. After executing it the shell exits

-readonly  Connect in readonly mode (only for connecting with -path)

-path      Points to a neo4j db path so that a local server can be started there

-config    Points to a config file when starting a local server


Example arguments for remote:

-port 1337

-host 192.168.1.234 -port 1337 -name shell

-host localhost -readonly

...or no arguments for default values

Example arguments for local:

-path /path/to/db

-path /path/to/db -config /path/to/neo4j.config

-path /path/to/db -readonly

Caused by: java.lang.OutOfMemoryError: Java heap space | GB+Tree[file:/u02/isi/zdr/graph/neo4j-community-3.4.9/data/databases/graph.db/schema/index/lucene_native-2.0/134/string-1.0/index-134, layout:StringLayout[version:0.1, identifier:24016946018123776], generation:16587/16588]

at org.neo4j.io.pagecache.impl.muninn.CursorFactory.takeWriteCursor(CursorFactory.java:62)

at org.neo4j.io.pagecache.impl.muninn.MuninnPagedFile.io(MuninnPagedFile.java:186)

at org.neo4j.index.internal.gbptree.FreeListIdProvider.releaseId(FreeListIdProvider.java:217)

at org.neo4j.index.internal.gbptree.InternalTreeLogic.createSuccessorIfNeeded(InternalTreeLogic.java:1289)

at org.neo4j.index.internal.gbptree.InternalTreeLogic.insertInLeaf(InternalTreeLogic.java:513)

at org.neo4j.index.internal.gbptree.InternalTreeLogic.insert(InternalTreeLogic.java:356)

at org.neo4j.index.internal.gbptree.GBPTree$SingleWriter.merge(GBPTree.java:1234)

at org.neo4j.kernel.impl.index.schema.NativeSchemaIndexUpdater.processAdd(NativeSchemaIndexUpdater.java:132)

at org.neo4j.kernel.impl.index.schema.NativeSchemaIndexUpdater.processUpdate(NativeSchemaIndexUpdater.java:86)

at org.neo4j.kernel.impl.index.schema.NativeSchemaIndexUpdater.process(NativeSchemaIndexUpdater.java:61)

at org.neo4j.kernel.impl.index.schema.fusion.FusionIndexUpdater.process(FusionIndexUpdater.java:41)

at org.neo4j.kernel.impl.api.index.updater.DelegatingIndexUpdater.process(DelegatingIndexUpdater.java:40)

at org.neo4j.kernel.impl.api.index.IndexingService.processUpdate(IndexingService.java:516)

at org.neo4j.kernel.impl.api.index.IndexingService.apply(IndexingService.java:479)

at org.neo4j.kernel.impl.api.index.IndexingService.apply(IndexingService.java:463)

at org.neo4j.kernel.impl.transaction.command.IndexUpdatesWork.apply(IndexUpdatesWork.java:63)

at org.neo4j.kernel.impl.transaction.command.IndexUpdatesWork.apply(IndexUpdatesWork.java:42)

at org.neo4j.concurrent.WorkSync.doSynchronizedWork(WorkSync.java:231)

at org.neo4j.concurrent.WorkSync.tryDoWork(WorkSync.java:157)

at org.neo4j.concurrent.WorkSync.apply(WorkSync.java:91)



           

JAVA代碼實作索引

/**
     * @param
     * @return
     * @Description: TODO(建構索引并傳回MESSAGE - 不支援自動更新)
     */
    private String chineseFulltextIndex(String indexName, String labelName, List<String> propKeys) {
       
Label label <span class="token operator">=</span> Label<span class="token punctuation">.</span><span class="token function">label</span><span class="token punctuation">(</span>labelName<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment"><span class="hljs-comment">// 按照标簽找到該标簽下的所有節點</span></span>
    ResourceIterator<span class="token generics function"><span class="token punctuation">&lt;</span>Node<span class="token punctuation">&gt;</span></span> nodes <span class="token operator">=</span> db<span class="token punctuation">.</span><span class="token function">findNodes</span><span class="token punctuation">(</span>label<span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string">"nodes:"</span></span> <span class="token operator">+</span> nodes<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword"><span class="hljs-keyword">int</span></span> nodesSize <span class="token operator">=</span> <span class="token number"><span class="hljs-number">0</span></span><span class="token punctuation">;</span>
    <span class="token keyword"><span class="hljs-keyword">int</span></span> propertiesSize <span class="token operator">=</span> <span class="token number"><span class="hljs-number">0</span></span><span class="token punctuation">;</span>

    <span class="token comment"><span class="hljs-comment">// 循環存在問題 更新到3000萬之後程式開始卡頓</span></span>
    <span class="token keyword"><span class="hljs-keyword">while</span></span> <span class="token punctuation">(</span>nodes<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        nodesSize<span class="token operator">++</span><span class="token punctuation">;</span>
        Node node <span class="token operator">=</span> nodes<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string">"current nodes:"</span></span> <span class="token operator">+</span> node<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token comment"><span class="hljs-comment">// 每個節點上需要添加索引的屬性</span></span>
        Set<span class="token operator">&lt;</span>Map<span class="token punctuation">.</span>Entry<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">,</span> Object<span class="token punctuation">&gt;</span></span><span class="token operator">&gt;</span> properties <span class="token operator">=</span> node<span class="token punctuation">.</span><span class="token function">getProperties</span><span class="token punctuation">(</span>propKeys<span class="token punctuation">.</span><span class="token function">toArray</span><span class="token punctuation">(</span><span class="token keyword"><span class="hljs-keyword">new</span></span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token number"><span class="hljs-number">0</span></span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">entrySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string">"current node properties"</span></span> <span class="token operator">+</span> properties<span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token comment"><span class="hljs-comment">// 查詢該節點是否已有索引,有的話删除</span></span>
        <span class="token keyword"><span class="hljs-keyword">if</span></span> <span class="token punctuation">(</span>db<span class="token punctuation">.</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">existsForNodes</span><span class="token punctuation">(</span>indexName<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            Index<span class="token generics function"><span class="token punctuation">&lt;</span>Node<span class="token punctuation">&gt;</span></span> oldIndex <span class="token operator">=</span> db<span class="token punctuation">.</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forNodes</span><span class="token punctuation">(</span>indexName<span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string">"current node index"</span></span> <span class="token operator">+</span> oldIndex<span class="token punctuation">)</span><span class="token punctuation">;</span>
            oldIndex<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span>node<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

        <span class="token comment"><span class="hljs-comment">// 為該節點的每個需要添加索引的屬性添加全文索引</span></span>
        Index<span class="token generics function"><span class="token punctuation">&lt;</span>Node<span class="token punctuation">&gt;</span></span> nodeIndex <span class="token operator">=</span> db<span class="token punctuation">.</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forNodes</span><span class="token punctuation">(</span>indexName<span class="token punctuation">,</span> FULL_INDEX_CONFIG<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword"><span class="hljs-keyword">for</span></span> <span class="token punctuation">(</span>Map<span class="token punctuation">.</span>Entry<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">,</span> Object<span class="token punctuation">&gt;</span></span> property <span class="token operator">:</span> properties<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            propertiesSize<span class="token operator">++</span><span class="token punctuation">;</span>
            nodeIndex<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>node<span class="token punctuation">,</span> property<span class="token punctuation">.</span><span class="token function">getKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> property<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token comment"><span class="hljs-comment">// 計算耗時</span></span>
    <span class="token punctuation">}</span>

    String message <span class="token operator">=</span> <span class="token string"><span class="hljs-string">"IndexName:"</span></span> <span class="token operator">+</span> indexName <span class="token operator">+</span> <span class="token string"><span class="hljs-string">",LabelName:"</span></span> <span class="token operator">+</span> labelName <span class="token operator">+</span> <span class="token string"><span class="hljs-string">",NodesSize:"</span></span> <span class="token operator">+</span> nodesSize <span class="token operator">+</span> <span class="token string"><span class="hljs-string">",PropertiesSize:"</span></span> <span class="token operator">+</span> propertiesSize<span class="token punctuation">;</span>
    <span class="token keyword"><span class="hljs-keyword">return</span></span> message<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
           

Java.lang.OutOfMemory是java.lang.VirtualMachineError的一個子類,當Java虛拟機中斷,或是超出可用資源時抛出。

通路資料庫時程式會擷取鎖和記憶體,在事務沒有被完成之前鎖和記憶體是不會釋放的。是以現在很容易了解上述BUG的出現的原因。(三)實作的索引程式中,是擷取節點之後在WHILE循環中執行建構索引,直到索引建構完畢事務才會自動被關閉,自動執行記憶體回收等操作。當擷取的資料量巨大的時候,必然會出現記憶體溢出。

使用批量事務送出的機制。

/**
     * @param
     * @return
     * @Description: TODO(建構索引并傳回MESSAGE - 不支援自動更新)
     */
    private String chineseFulltextIndex(String indexName, String labelName, List<String> propKeys) {
       
Label label <span class="token operator">=</span> Label<span class="token punctuation">.</span><span class="token function">label</span><span class="token punctuation">(</span>labelName<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword"><span class="hljs-keyword">int</span></span> nodesSize <span class="token operator">=</span> <span class="token number"><span class="hljs-number">0</span></span><span class="token punctuation">;</span>
    <span class="token keyword"><span class="hljs-keyword">int</span></span> propertiesSize <span class="token operator">=</span> <span class="token number"><span class="hljs-number">0</span></span><span class="token punctuation">;</span>

    <span class="token comment"><span class="hljs-comment">// 按照标簽找到該标簽下的所有節點</span></span>
    ResourceIterator<span class="token generics function"><span class="token punctuation">&lt;</span>Node<span class="token punctuation">&gt;</span></span> nodes <span class="token operator">=</span> db<span class="token punctuation">.</span><span class="token function">findNodes</span><span class="token punctuation">(</span>label<span class="token punctuation">)</span><span class="token punctuation">;</span>
    Transaction tx <span class="token operator">=</span> db<span class="token punctuation">.</span><span class="token function">beginTx</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword"><span class="hljs-keyword">try</span></span> <span class="token punctuation">{</span>
        <span class="token keyword"><span class="hljs-keyword">int</span></span> batch <span class="token operator">=</span> <span class="token number"><span class="hljs-number">0</span></span><span class="token punctuation">;</span>
        <span class="token keyword"><span class="hljs-keyword">long</span></span> startTime <span class="token operator">=</span> System<span class="token punctuation">.</span><span class="token function">nanoTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword"><span class="hljs-keyword">while</span></span> <span class="token punctuation">(</span>nodes<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            nodesSize<span class="token operator">++</span><span class="token punctuation">;</span>
            Node node <span class="token operator">=</span> nodes<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

            <span class="token keyword"><span class="hljs-keyword">boolean</span></span> indexed <span class="token operator">=</span> <span class="token boolean"><span class="hljs-keyword">false</span></span><span class="token punctuation">;</span>
            <span class="token comment"><span class="hljs-comment">// 每個節點上需要添加索引的屬性</span></span>
            Set<span class="token operator">&lt;</span>Map<span class="token punctuation">.</span>Entry<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">,</span> Object<span class="token punctuation">&gt;</span></span><span class="token operator">&gt;</span> properties <span class="token operator">=</span> node<span class="token punctuation">.</span><span class="token function">getProperties</span><span class="token punctuation">(</span>propKeys<span class="token punctuation">.</span><span class="token function">toArray</span><span class="token punctuation">(</span><span class="token keyword"><span class="hljs-keyword">new</span></span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token number"><span class="hljs-number">0</span></span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">entrySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

            <span class="token comment"><span class="hljs-comment">// 查詢該節點是否已有索引,有的話删除</span></span>
            <span class="token keyword"><span class="hljs-keyword">if</span></span> <span class="token punctuation">(</span>db<span class="token punctuation">.</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">existsForNodes</span><span class="token punctuation">(</span>indexName<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                Index<span class="token generics function"><span class="token punctuation">&lt;</span>Node<span class="token punctuation">&gt;</span></span> oldIndex <span class="token operator">=</span> db<span class="token punctuation">.</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forNodes</span><span class="token punctuation">(</span>indexName<span class="token punctuation">)</span><span class="token punctuation">;</span>
                oldIndex<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span>node<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>

            <span class="token comment"><span class="hljs-comment">// 為該節點的每個需要添加索引的屬性添加全文索引</span></span>
            Index<span class="token generics function"><span class="token punctuation">&lt;</span>Node<span class="token punctuation">&gt;</span></span> nodeIndex <span class="token operator">=</span> db<span class="token punctuation">.</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forNodes</span><span class="token punctuation">(</span>indexName<span class="token punctuation">,</span> FULL_INDEX_CONFIG<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword"><span class="hljs-keyword">for</span></span> <span class="token punctuation">(</span>Map<span class="token punctuation">.</span>Entry<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">,</span> Object<span class="token punctuation">&gt;</span></span> property <span class="token operator">:</span> properties<span class="token punctuation">)</span> <span class="token punctuation">{</span>
                indexed <span class="token operator">=</span> <span class="token boolean"><span class="hljs-keyword">true</span></span><span class="token punctuation">;</span>
                propertiesSize<span class="token operator">++</span><span class="token punctuation">;</span>
                nodeIndex<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>node<span class="token punctuation">,</span> property<span class="token punctuation">.</span><span class="token function">getKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> property<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
            <span class="token comment"><span class="hljs-comment">// 批量送出事務</span></span>
            <span class="token keyword"><span class="hljs-keyword">if</span></span> <span class="token punctuation">(</span>indexed<span class="token punctuation">)</span> <span class="token punctuation">{</span>
                <span class="token keyword"><span class="hljs-keyword">if</span></span> <span class="token punctuation">(</span><span class="token operator">++</span>batch <span class="token operator">==</span> <span class="token number"><span class="hljs-number">50</span></span><span class="hljs-number">_000</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                    batch <span class="token operator">=</span> <span class="token number"><span class="hljs-number">0</span></span><span class="token punctuation">;</span>
                    tx<span class="token punctuation">.</span><span class="token function">success</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                    tx<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                    tx <span class="token operator">=</span> db<span class="token punctuation">.</span><span class="token function">beginTx</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

                    <span class="token comment"><span class="hljs-comment">// 計算耗時</span></span>
                    startTime <span class="token operator">=</span> <span class="token function">indexConsumeTime</span><span class="token punctuation">(</span>startTime<span class="token punctuation">,</span> nodesSize<span class="token punctuation">,</span> propertiesSize<span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token punctuation">}</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
        tx<span class="token punctuation">.</span><span class="token function">success</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token comment"><span class="hljs-comment">// 計算耗時</span></span>
        <span class="token function">indexConsumeTime</span><span class="token punctuation">(</span>startTime<span class="token punctuation">,</span> nodesSize<span class="token punctuation">,</span> propertiesSize<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span> <span class="token keyword"><span class="hljs-keyword">finally</span></span> <span class="token punctuation">{</span>
        tx<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    String message <span class="token operator">=</span> <span class="token string"><span class="hljs-string">"IndexName:"</span></span> <span class="token operator">+</span> indexName <span class="token operator">+</span> <span class="token string"><span class="hljs-string">",LabelName:"</span></span> <span class="token operator">+</span> labelName <span class="token operator">+</span> <span class="token string"><span class="hljs-string">",NodesSize:"</span></span> <span class="token operator">+</span> nodesSize <span class="token operator">+</span> <span class="token string"><span class="hljs-string">",PropertiesSize:"</span></span> <span class="token operator">+</span> propertiesSize<span class="token punctuation">;</span>
    <span class="token keyword"><span class="hljs-keyword">return</span></span> message<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
           

50_000為批次進行送出,依次累加nodeSize和propertieSize,consume還是每批送出的耗時。

可以看到在剛開始送出的時候耗時較多,之後基本上穩定在每批送出耗時:2s~5s/5萬條。10億nodes,耗時估算11h~23h之間。

Build index-nodeSize:50000,propertieSize:148777,consume:21434ms
Build index-nodeSize:100000,propertieSize:297883,consume:18493ms
Build index-nodeSize:150000,propertieSize:446936,consume:17140ms
Build index-nodeSize:200000,propertieSize:595981,consume:17323ms
Build index-nodeSize:250000,propertieSize:745039,consume:19680ms
Build index-nodeSize:300000,propertieSize:894026,consume:18451ms
Build index-nodeSize:350000,propertieSize:1042994,consume:20266ms
Build index-nodeSize:400000,propertieSize:1160186,consume:12787ms
Build index-nodeSize:450000,propertieSize:1210186,consume:1946ms
Build index-nodeSize:500000,propertieSize:1260186,consume:3174ms
Build index-nodeSize:550000,propertieSize:1310186,consume:3090ms
Build index-nodeSize:600000,propertieSize:1360186,consume:3063ms
Build index-nodeSize:650000,propertieSize:1410186,consume:1868ms
Build index-nodeSize:700000,propertieSize:1460186,consume:2036ms
Build index-nodeSize:750000,propertieSize:1510186,consume:3784ms
Build index-nodeSize:800000,propertieSize:1560186,consume:3037ms
Build index-nodeSize:850000,propertieSize:1610186,consume:2627ms
Build index-nodeSize:900000,propertieSize:1660186,consume:1900ms
Build index-nodeSize:950000,propertieSize:1710186,consume:2944ms
Build index-nodeSize:1000000,propertieSize:1760186,consume:3369ms
Build index-nodeSize:1050000,propertieSize:1810186,consume:3289ms
Build index-nodeSize:1100000,propertieSize:1860186,consume:2763ms
Build index-nodeSize:1150000,propertieSize:1910186,consume:3237ms
Build index-nodeSize:1200000,propertieSize:1960186,consume:3408ms
Build index-nodeSize:1250000,propertieSize:2010186,consume:3644ms
Build index-nodeSize:1300000,propertieSize:2060186,consume:3661ms
Build index-nodeSize:1350000,propertieSize:2110186,consume:2964ms
Build index-nodeSize:1400000,propertieSize:2160186,consume:3219ms
Build index-nodeSize:1450000,propertieSize:2210186,consume:3356ms
Build index-nodeSize:1500000,propertieSize:2260186,consume:4115ms
Build index-nodeSize:1550000,propertieSize:2310186,consume:3188ms
Build index-nodeSize:1600000,propertieSize:2360186,consume:3364ms
Build index-nodeSize:1650000,propertieSize:2410186,consume:3799ms
Build index-nodeSize:1700000,propertieSize:2460186,consume:4301ms
Build index-nodeSize:1750000,propertieSize:2510186,consume:3772ms
Build index-nodeSize:1800000,propertieSize:2560186,consume:3692ms
Build index-nodeSize:1850000,propertieSize:2610186,consume:3428ms
Build index-nodeSize:1900000,propertieSize:2660186,consume:2930ms
           

備注:在本次測試的資料集上執行索引建構2小時之後,此時已經被索引了1495萬個NODES,速度下降明顯,需要進一步優化。

Build index-nodeSize:13850000,propertieSize:14610186,consume:97290ms
Build index-nodeSize:13900000,propertieSize:14660186,consume:7441ms
Build index-nodeSize:13950000,propertieSize:14710186,consume:3730ms
Build index-nodeSize:14000000,propertieSize:14760186,consume:3512ms
Build index-nodeSize:14050000,propertieSize:14810186,consume:4545ms
Build index-nodeSize:14100000,propertieSize:14860186,consume:12100ms
Build index-nodeSize:14150000,propertieSize:14910186,consume:83071ms
Build index-nodeSize:14200000,propertieSize:14960186,consume:7417ms
Build index-nodeSize:14250000,propertieSize:15010186,consume:3579ms
Build index-nodeSize:14300000,propertieSize:15060186,consume:64841ms
Build index-nodeSize:14350000,propertieSize:15110186,consume:7553ms
Build index-nodeSize:14400000,propertieSize:15160186,consume:63141ms
Build index-nodeSize:14450000,propertieSize:15210186,consume:64316ms
Build index-nodeSize:14500000,propertieSize:15260186,consume:187510ms
Build index-nodeSize:14550000,propertieSize:15310186,consume:247571ms
Build index-nodeSize:14600000,propertieSize:15360186,consume:224611ms
Build index-nodeSize:14650000,propertieSize:15410186,consume:244539ms
Build index-nodeSize:14700000,propertieSize:15460186,consume:354684ms
Build index-nodeSize:14750000,propertieSize:15510186,consume:236970ms
Build index-nodeSize:14800000,propertieSize:15560186,consume:308532ms
Build index-nodeSize:14850000,propertieSize:15610186,consume:429815ms
Build index-nodeSize:14900000,propertieSize:15660186,consume:409451ms
Build index-nodeSize:14950000,propertieSize:15710186,consume:456980ms
           

建構程式在運作4個小時之後,被索引了1530萬NODES,索引建構速度幾乎慢到不可接受,持續優化中…

Build index-nodeSize:14750000,propertieSize:15510186,consume:236970ms
Build index-nodeSize:14800000,propertieSize:15560186,consume:308532ms
Build index-nodeSize:14850000,propertieSize:15610186,consume:429815ms
Build index-nodeSize:14900000,propertieSize:15660186,consume:409451ms
Build index-nodeSize:14950000,propertieSize:15710186,consume:456980ms
Build index-nodeSize:15000000,propertieSize:15760186,consume:447474ms
Build index-nodeSize:15050000,propertieSize:15810186,consume:580270ms
Build index-nodeSize:15100000,propertieSize:15860186,consume:840488ms
Build index-nodeSize:15150000,propertieSize:15910186,consume:573554ms
Build index-nodeSize:15200000,propertieSize:15960186,consume:748670ms
Build index-nodeSize:15250000,propertieSize:16010186,consume:1305363ms
Build index-nodeSize:15300000,propertieSize:16060186,consume:2495139ms
           

上述測試案例的源碼位置

</div>           
上一篇: neo4j 初探
下一篇: neo4j采坑記