【翻译自:https://neo4j.com/developer/kb/understanding-data-on-disk/ 】
【适用版本:3.0, 3.1, 3.2, 3.3, 3.4, 3.5】
【由Neo4j APAC授权编译发布】
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
网友评论