美文网首页Neo4J图数据库与Neo4j
Neo4j知识库(三):Neo4j数据存储概览

Neo4j知识库(三):Neo4j数据存储概览

作者: 数据大鱼 | 来源:发表于2020-03-16 12:36 被阅读0次

    【翻译自:https://neo4j.com/developer/kb/understanding-data-on-disk/
    【适用版本:3.0, 3.1, 3.2, 3.3, 3.4, 3.5】
    【由Neo4j APAC授权编译发布】

    Neo4j知识库

            Neo4j数据库文件可持久化存储。通常,数据相关文件默认存储在data/databases/graph.db(v3.x +)的数据目录。下面将为您解释以neostore.*开头的文件类型及其存储的数据:

    nodestore* 存储图中节点数据
    relationship* 存储图中创建和定义的关系数据
    property* 存储数据库中的键/值属性
    label* 存储图中标签数据

            我们知道,Neo4j是无模式的数据库,我们使用固定长度来保存数据,并通过文件偏移量在查询中读取数据。下表列出了Neo4j存储的Java对象类型的固定大小:

    Store File                                      |  Record size   |  Contents
    ----------------------------------------------------------------------------------------------------------------------------
    neostore.nodestore.db                  | 15 B              |  节点
    neostore.relationshipstore.db        | 34 B              |  关系
    neostore.propertystore.db             | 41 B              |  属性
    neostore.propertystore.db.strings  | 128 B           |  string属性
    neostore.propertystore.db.arrays   | 128 B           |  array属性
    IndexedProperty                             | 1/3 * AVG(X)|  每个索引约为属性均值的1/3

            关于属性的注意事项:

    1)属性记录的固定长度为32 bytes,分为四个8B block。block可以包含key或value,或者key+value;
    2)key和type占3.5 bytes(key 4 bit,type 24 bit);
    3)boolean,byte,short,int,char,float类型存放在同一block;
    4)small long类型存放在block;
    5)big long或double类型存放在单独的block(该属性使用的两个block);
    6)string或array类型的引用与key存放在同一block;
    7)block中剩余的长度如果能够容下short string或short array(包括key-block的剩余字节),则将其存储在同一block;
    8)long strings/arrays不能存在8B
    9)blocks,我们将通过指向string/array(128B)的指针来存储;
    ......其他类型

            磁盘的数据都是以固定长度的记录链表存储。属性以属性的记录链接存储,每个属性记录都包含键和值,并指向下一个属性。节点和关系指向其第一个属性记录,在关系链表中的节点指向其第一个关系。每个关系则指向开始和结束节点,同时,分别指向起始节点和结束节点的上一个和下一个关系记录。
            简单起见,我们假定属性与属性记录的比率为1:1,也就是说一个属性长度固定为41B。当然,在实际场景中还需要具体考虑。
            数据库存储空间估算的常见示例如下:

    场景1

    初始状态
    节点数:4M节点
    每个节点有3个属性(共12M属性)
    关系数:2M关系
    每个关系有1个属性(共2M属性)

    计算后的磁盘存储大小为:
    节点:4,000,000x15B = 60,000,000B(60MB)
    关系:2,000,000x34B = 68,000,000B(68MB)
    属性:14,000,000x41B = 574,000,000B(574MB)
    总计:703MB

    场景2 

    4倍增长 + 增加的属性 + 所有属性的索引
    节点数:16M节点
    每个节点有5个属性(共80M属性)
    关系数:8M关系
    每个关系有2个属性(共16M属性)

    计算后的磁盘存储大小为:
    节点:16.000.000x15B = 240.000.000B(240MB)
    关系:8.000.000x34B = 272.000.000B(272MB)
    属性:96.000.000x41B = 3.936.000.000B(3936MB)
    索引:4448MB
            *〜33%= 1468MB
    总计:5916MB

            通过这两个示例,您可以估算出磁盘存储大小及其增长。

    更多技术咨询:
    Email:yusonglin@we-yun.com

    相关文章

      网友评论

        本文标题:Neo4j知识库(三):Neo4j数据存储概览

        本文链接:https://www.haomeiwen.com/subject/jfcgehtx.html