知识库

了解 Neo4j 的磁盘数据

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          | Nodes
neostore.relationshipstore.db     | 34 B          | Relationships
neostore.propertystore.db         | 41 B          | Properties for nodes and relationships
neostore.propertystore.db.strings | 128 B         | Values of string properties
neostore.propertystore.db.arrays  | 128 B         | Values of array properties
Indexed Property                  | 1/3 * AVG(X)  | Each index entry is approximately 1/3 of the average property value size
关于属性的一些注意事项
  • 属性记录的有效负载为 32 字节,分为四个 8B 块。每个字段可以保存一个键或一个值,或者同时保存一个键和一个值。

  • 键和类型占用 3.5 字节(键 4 位,类型 24 位)

  • boolean、byte、short、int、char、float 适应于同一个块的剩余字节

  • 一个小的 long 也适应于同一个块

  • 一个大的 long 或一个 double 存储在单独的块中(意味着该属性使用两个块)

  • 对字符串存储或数组存储的引用适应于与键相同的块

  • 一个短字符串或短数组如果适应于剩余块(包括键块的剩余字节)则存储在同一记录中

  • 不适合 8B 块的长字符串/数组将有一个指向字符串/数组存储中记录的指针(128B)

  • …​ 其他类型更复杂!

存储在磁盘上的数据都是固定大小记录的链接列表。属性作为属性记录的链接列表存储,每个记录都包含一个键和一个值,并指向下一个属性。每个节点和关系都引用其第一个属性记录。节点还引用其关系链中的第一个关系。每个关系都引用其开始和结束节点。它还分别引用开始和结束节点的先前和下一个关系记录。

 

一个基本的磁盘空间计算示例可能类似于

为了简单起见,我们假设属性与属性记录的比率为 1:1,这意味着单个属性始终为 41B。显然,根据上面的考虑,在现实生活中情况可能并不那么简单。

场景 #1 - 初始状态
  • 节点数:400 万个节点

    • 每个节点有 3 个属性(总共 1200 万个属性)

  • 关系数:200 万个关系

    • 每个关系有 1 个属性(总共 200 万个属性)

 

这转化为磁盘上的以下大小
  • 节点:4.000.000x15B = 60.000.000B (60MB)

  • 关系:2.000.000x34B = 68.000.000B (68MB)

  • 属性:14.000.000x41B = 574.000.000B (574MB)

  • 总计:703MB

 

场景 #2 - 4 倍增长 + 添加属性 + 对所有属性进行索引
  • 节点数:1600 万个节点

    • 每个节点有 5 个属性(总共 8000 万个属性)

  • 关系数:800 万个关系

    • 每个关系有 2 个属性(总共 1600 万个属性)

 

这转化为磁盘上的以下大小
  • 节点: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

 

您可以参考这些值来了解磁盘大小和增长的预期情况。