了解数据库增长
确定图大小的最简方法是通过文件系统并累计名为 *store.db* 的文件大小。例如在 Linux 实现上可以运行
$ du -hc $NEO4J_HOME/data/databases/graph.db/*store.db*
此命令应在已停止的数据库上执行,或在最近已完成检查点(即紧接备份之后)的数据库上执行
运行后会产生类似如下的输出
5.5M neostore.labelscanstore.db 8.0K neostore.labeltokenstore.db 4.0K neostore.labeltokenstore.db.id 8.0K neostore.labeltokenstore.db.names 4.0K neostore.labeltokenstore.db.names.id 72M neostore.nodestore.db 4.0K neostore.nodestore.db.id 8.0K neostore.nodestore.db.labels 4.0K neostore.nodestore.db.labels.id 196M neostore.propertystore.db 8.0K neostore.propertystore.db.arrays 4.0K neostore.propertystore.db.arrays.id 4.0K neostore.propertystore.db.id 8.0K neostore.propertystore.db.index 4.0K neostore.propertystore.db.index.id 8.0K neostore.propertystore.db.index.keys 4.0K neostore.propertystore.db.index.keys.id 8.0K neostore.propertystore.db.strings 4.0K neostore.propertystore.db.strings.id 8.0K neostore.relationshipgroupstore.db 4.0K neostore.relationshipgroupstore.db.id 0 neostore.relationshipstore.db 4.0K neostore.relationshipstore.db.id 0 neostore.relationshiptypestore.db 4.0K neostore.relationshiptypestore.db.id 8.0K neostore.relationshiptypestore.db.names 4.0K neostore.relationshiptypestore.db.names.id 8.0K neostore.schemastore.db 4.0K neostore.schemastore.db.id 273M total
最终行报告图的总大小为 273 M。该数值不包括 Neo4j 事务日志 (neostore.transaction.*) 的大小,因为这些文件的大小和保留策略均由用户自行配置。
在上述列表中,输出来源于一个包含 500 万个节点、全部标记为 :Person,且每个节点都有一个名为 id、取值范围为 1 到 500 万的属性的图。该数据是通过运行以下等价命令生成的
USING PERIODIC COMMIT 50000
LOAD CSV WITH HEADERS FROM 'file:///person.csv' AS row
CREATE (:Person { id: row.id} );
因此你会看到 neostore.labelscanstore*、neostore.nodestore* 和 neostore.propertystore* 文件占用了超过默认空间的大小。由于图中没有关系,名为 neostore.relationship* 的文件实际是空的。
显而易见,随着数据的加入,这些文件会增大。不过有一点例外可能解释了为何添加更多数据时数据库大小反而会减小。
在上述文件列表中,以 .id 结尾的文件(例如 neostore.nodestore.db.id)充当可回收的 ID 垃圾箱。因为图仅仅被填充了 500 万个 :Person 节点,且未删除任何节点,neostore.nodestore.db.id 为空,节点信息记录在 neostore.nodestore.db 中。然而,如果我们随后删除这 500 万节点,会发现 neostore.nodestore.db 的大小并未下降,而 neostore.nodestore.db.id 却增长到约 39 M。于是,这次删除导致整体图大小至少增加了 39 M。若我们再次插入这 500 万节点,neostore.nodestore.db.id 的大小会下降,因为在插入新节点时会先检查是否可以复用之前使用过的 ID,并在复用后把该 ID 从 neostore.nodestore.db.id 中移除。由于 neostore.nodestore.db.id 原本保存了 500 万可复用的 ID,而我们正好再加入了 500 万节点,完成后该文件几乎为空(约 4.0 K)。通过添加这些节点,将 neostore.nodestore.db.id 从 39 M 减少到 4.0 K,整个数据库大小也随之以同样方式减小。请注意,在整个过程中 neostore.nodestore.db 的大小并未发生变化。
总结如下(相对于这两个文件,并在执行 neo4j stop 后捕获文件大小):
-
步骤 1:空图
0 neostore.nodestore.db 4.0K neostore.nodestore.db.id
-
步骤 2:添加 500 万个 :Person 节点
72M neostore.nodestore.db 4.0K neostore.nodestore.db.id
-
步骤 3:删除 500 万个 :Person 节点(即
CALL apoc.periodic.commit("match (n:Person) with n limit {limit} delete n return count(*)",{limit:50000});) — 此时图已为空72M neostore.nodestore.db 39M neostore.nodestore.db.id
-
步骤 4:重新添加这 500 万个 :Person 节点
72M neostore.nodestore.db 4.0K neostore.nodestore.db.id
如果你已经完成上述第 3 步且不打算再添加节点,但希望缩小文件体积,建议使用 copy-store.sh。该工具会读取离线数据库并复制数据,不会包含已写入但不再使用的冗余或可复用 ID 列表等开销。
在对图(即第 3 步完成时的状态)运行 copy-store.sh 以准备新图后,生成的全新 graph.db 中这两个文件的定义如下
0 neostore.nodestore.db 4.0K neostore.nodestore.db.id
此页面有帮助吗?