B+Tree 中的数据是否应该排序,一次应该加载多少数据?
Should data in B+Tree be ordered and how much data should I be loading at a time?
在我的 B+Tree 中,我在叶级别对键进行了排序,数据指针指向一个单独的数据文件。这个问题是指这个数据文件中数据的顺序。
如我所见,订购时:
读取一个块时更容易加载一个块中的所有数据,因为数据的存储顺序与其键相同,所以你只需要检查相邻的数据指针是否在同一个街区。
访问大量相邻数据或执行范围时读取较少,因为数据更有可能包含在同一块中。
当deleting/splitting/inserting
增加碎片和写入
未订购时:
插入时减少写入,因为数据只是附加到与节点关联的最后一个块的末尾。
执行范围时增加读取,因为数据不太可能在多个块之间拆分。
在同一块中找到其他数据所属的条目要慢得多,因为您必须遍历节点中的所有条目以检查它们的数据指针。
或者,当我需要从该节点内的条目访问数据时,是否应该只将整个节点加载到内存中?
寻找关于我应该存储数据的最佳方式的第二种选择 (ordered/unordered) 以及在对一个值执行简单的“获取”时我应该加载多少数据指针?
谢谢!
Alternatively, should I just load entire nodes into memory when I need to access data from an entry within that node?
当然可以。这就是 B 树数据结构家族背后的思想。它不适用于 reading/writing 部分 节点(块) from/to 慢速存储。当需要一个节点时,它会被完整地读入内存(如果尚未加载)、操作并完全写回以持久化它。
由于节点本身的数据操作发生在内存中,因此选择是否保持节点的内容排序并不重要。 read/write 对较慢(呃)存储的操作将对整体性能更具决定性。
考虑任一选择的时间复杂度也无关紧要,因为节点中的键数有预设的最大值。所以所有的单节点操作都可以认为是一个常数时间复杂度。
您可以 时间 不同的实现,看看是否可以做出明确的选择。这个选择将取决于B树的度数。
在我的 B+Tree 中,我在叶级别对键进行了排序,数据指针指向一个单独的数据文件。这个问题是指这个数据文件中数据的顺序。
如我所见,订购时:
读取一个块时更容易加载一个块中的所有数据,因为数据的存储顺序与其键相同,所以你只需要检查相邻的数据指针是否在同一个街区。
访问大量相邻数据或执行范围时读取较少,因为数据更有可能包含在同一块中。
当deleting/splitting/inserting
增加碎片和写入
未订购时:
插入时减少写入,因为数据只是附加到与节点关联的最后一个块的末尾。
执行范围时增加读取,因为数据不太可能在多个块之间拆分。
在同一块中找到其他数据所属的条目要慢得多,因为您必须遍历节点中的所有条目以检查它们的数据指针。
或者,当我需要从该节点内的条目访问数据时,是否应该只将整个节点加载到内存中?
寻找关于我应该存储数据的最佳方式的第二种选择 (ordered/unordered) 以及在对一个值执行简单的“获取”时我应该加载多少数据指针?
谢谢!
Alternatively, should I just load entire nodes into memory when I need to access data from an entry within that node?
当然可以。这就是 B 树数据结构家族背后的思想。它不适用于 reading/writing 部分 节点(块) from/to 慢速存储。当需要一个节点时,它会被完整地读入内存(如果尚未加载)、操作并完全写回以持久化它。
由于节点本身的数据操作发生在内存中,因此选择是否保持节点的内容排序并不重要。 read/write 对较慢(呃)存储的操作将对整体性能更具决定性。
考虑任一选择的时间复杂度也无关紧要,因为节点中的键数有预设的最大值。所以所有的单节点操作都可以认为是一个常数时间复杂度。
您可以 时间 不同的实现,看看是否可以做出明确的选择。这个选择将取决于B树的度数。