有很多结构可以将树/地图存储到像B-Trees这样的磁盘,或存储像R-Trees这样的空间数据。有没有用于将列表/数组存储到磁盘的结构?
最重要的是,添加/删除功能不应该重写整个文件,并且需要快速访问来获取/设置数据。
答案 0 :(得分:0)
事实上,B-Tree不存储任何树,而是将数据存储在树中。如果要存储列表,请使用列表。 使用B树,您可以添加/删除/获取/设置所有数据,但如果插入或删除元素,则不会重新编制索引。
解决方案可以是将索引映射到树中的ID的列表。因此,当您添加或删除元素时,您只需重写索引到ids列表,而不是整个树。
答案 1 :(得分:0)
必须重写整个文件主要与数据结构无关。这取决于您访问文件的方式。如果使用流,则唯一的选择是重写文件。另一方面,如果使用内存映射访问,则可以自由更改文件中的位。
由于列表/数组是线性的,因此假设您具有固定大小的元素,则可以轻松计算文件中的位置。能够直接寻找元素意味着O(1)读/写。剩下的问题是正确调整文件大小,因为您无法轻易附加空间。
如果元素不是固定大小,您可以采用类似FAT文件系统的方法来保存元素所在的索引。如果这还不够详细,你可以查看其他文件系统。它们都是List<File>
存储的方式。
http://vanillajava.blogspot.de/2011/12/using-memory-mapped-file-for-huge.html有一个很好的使用mmapped文件的例子