Java 类似文件系统的数据结构的快速持久表示

Java 类似文件系统的数据结构的快速持久表示,java,data-structures,Java,Data Structures,我希望有一个持久的数据结构和支持服务,可能是某种内存中的数据网格,但能够将数据保存到驱动器上。要存储的数据在结构上几乎与普通文件系统树相同,每个节点的子节点数量可变,但没有像符号链接这样的复杂情况。每个节点都有一些元信息负载。我基本上需要的是有效地获取两个方向上的所有分支,即如果我请求深度为1000的节点的所有父节点,我希望得到与请求其最近的父节点或直接子节点相同的响应时间。我希望能够更改节点在树中的位置,当然,也可以更改其所有子节点的位置 我知道Patricia树对于我来说是很好的,但是数据实

我希望有一个持久的数据结构和支持服务,可能是某种内存中的数据网格,但能够将数据保存到驱动器上。要存储的数据在结构上几乎与普通文件系统树相同,每个节点的子节点数量可变,但没有像符号链接这样的复杂情况。每个节点都有一些元信息负载。我基本上需要的是有效地获取两个方向上的所有分支,即如果我请求深度为1000的节点的所有父节点,我希望得到与请求其最近的父节点或直接子节点相同的响应时间。我希望能够更改节点在树中的位置,当然,也可以更改其所有子节点的位置

我知道Patricia树对于我来说是很好的,但是数据实际上不是一个文件系统,所以在树中没有任何与节点相关联的路径

最小存储数据量约为1亿个节点,实际存储数据量预计至少为5-15倍。

您看过吗?它可以充当嵌入式、持久化的图形数据库

顺便说一句,你可能需要大量的内存。我猜想,如果您想将其全部保存在内存中,每个节点至少需要100-1000字节。i、 e.对于10亿个节点,最高可达1 TB

如果没有那么多内存,您将需要那么多的磁盘空间,并且必须考虑到速度将慢很多倍。

包含以下内容的节点树可能适合您的用例:

名称 父指针 HashMap或名称的排序映射->子节点 节点级有效负载/元数据 这足以相当有效地实现大多数类似文件系统的遍历算法

另一种选择是考虑一个不可变的持久数据结构——这里的不变性将给你带来两大优势:

您可以只存储一次相同的数据/分支,这可能会大大减少内存需求。 您的数据结构将是线程安全的,以实现高效的并发访问,这是使用可变的树状结构很难实现的。
如果您认为持久数据方法可能合适,那么值得一看Datomic,它为此类数据提供数据库服务。

您可以在中对此进行建模neo4j@Justin,那坚持呢?@tom,我做到了,但它似乎出人意料地慢。尤其是当一个人有一棵又宽又深的树的时候。假设每个节点都有100个直接子节点,那么如何实现对深度为10K且具有指定ID的节点的搜索?Neo试图将整个图保存在内存中,但这需要大量节点。如果你不能将它放入内存,那么它的速度会很慢。但是不可变性并不能与频繁更改树一起发挥作用,不是吗?这就是持久性数据结构和常规不可变数据结构之间的区别。持久性的使用结构共享,因此不需要获取完整副本。这段视频在这个话题上很有启发性:是的,我们已经计算过了。每个节点的信息量预计约为300字节,因此10亿个没有任何其他数据的节点需要大约300GB的内存,在这种情况下这不是一个意外的数字。现在你可以购买512 GB到2 TB的盒子。我会从neo4j开始,即使你以后决定自己写。我怀疑neo4j的每个节点/关系开销很大。顺便问一下,你能告诉我是否有任何方法可以使用Hazelcast之类的工具来处理这个案例吗?我知道基本上不存在任何具有所需功能的数据结构,但我不能以某种方式重用现有的数据结构吗?我知道现在可以使用SPI实现任意的分布式数据结构,但是缺少文档,我找不到任何合适的例子。是的,开销的问题也困扰着我。不仅是在内存方面——正如我所说的,我找不到比遍历父对象的所有传出关系更好的方法来查找给定父对象的子对象,而在broad tree的情况下,这可能会很慢。您可以在父对象中维护子对象的集合,问题是这样会占用更多内存。通常,您可以通过使用更多内存来提高性能,但听起来您没有多少空闲空间。