Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找磁盘绑定的b树示例_C#_Algorithm_Disk_B Tree - Fatal编程技术网

C# 查找磁盘绑定的b树示例

C# 查找磁盘绑定的b树示例,c#,algorithm,disk,b-tree,C#,Algorithm,Disk,B Tree,也许我的GoogleFoo没有达到标准,但我想玩一个绑定到磁盘的b树算法。由于大多数教程和示例都是关于内存的,所以它们假设随机访问内存,其中更改树中的节点非常简单,但除了I/O密集型重写或使用内存映射文件之外,我想不出一个好方法 理论会很好,C#或Java会更好 编辑:我为不够清晰而道歉。我不是在寻找要使用的产品或代码库,而是一个示例或说明性代码库,以更好地理解如何构建磁盘备份的b树。首先,请参阅顶部的第二、第三、第四和第五个结果 第二,看到这个问题非常相似 第三,如果您使用MSSQL作为示例,

也许我的GoogleFoo没有达到标准,但我想玩一个绑定到磁盘的b树算法。由于大多数教程和示例都是关于内存的,所以它们假设随机访问内存,其中更改树中的节点非常简单,但除了I/O密集型重写或使用内存映射文件之外,我想不出一个好方法

理论会很好,C#或Java会更好


编辑:我为不够清晰而道歉。我不是在寻找要使用的产品或代码库,而是一个示例或说明性代码库,以更好地理解如何构建磁盘备份的b树。

首先,请参阅顶部的第二、第三、第四和第五个结果

第二,看到这个问题非常相似

第三,如果您使用MSSQL作为示例,您可以阅读一些内容并按照所述可视化页面(就像缓存线拆分一样,最小化此类拆分非常重要)。例如,MSSQL还对可编入索引的数据施加了一个大小限制,即页面大小的8k=限制

第四,看看我的问题的答案,我必须问的只是能够提供这个答案
或者,您可以使用十六进制编辑器查看数据库文件并查看如何映射,但这是极端的。

最快的键值DB(也包含一个与B+树一起工作的键值DB)之一是Tokyo Cabinet(或Kyoto Cabinet):)。我在对B+树进行基准测试时使用过它,代码很容易理解。它是用C编写的,但也有Java绑定。。。 东京内阁:

Berkley DB也使用B+树。然而,当我对Berkley DB进行基准测试时,它与东京内阁相比非常缓慢。。。

许多数据库(甚至只是键/值存储)使用B-树或封闭变量。可能值得一看HSQL、Derby或SQLite代码。一项很好的工作是调整页面以最小化IO,这可以在“真正的”代码库中看到。我还怀疑CodePlex上有一个writeup或小项目。我更喜欢一个更具说明性的方法。我不是在寻找一个优化的实现,而是一个我可以尝试的通用方法。无论如何,我不认为C#或Java中的某些东西是有用的。你需要一些非常低级的东西。。。我与东京内阁合作,对顺序/随机IO读取进行基准测试。理想情况下,节点的大小应该等于一个磁盘页。然而,到最后,你并没有很大的控制权。您可以设置节点大小,但磁盘又是另一个抽象级别,您不知道那里发生了什么。。。不同级别的缓存会让你的生活变得更糟:在“数据库问题”一节中有一个非常好的“为什么是B树”。希望这将有助于(在一个非常高的层次上)展示B树节点如何映射到磁盘块,以及为什么这是有益的。不幸的是,这里的评论讨论非常有启发性,这让我对我的问题有了答案,但没有一个适用的答案,也不能保证被标记为接受。也许我没有正确解释它。我不想将btree序列化到磁盘并返回。我希望有一个磁盘备份的b树,即当我编辑磁盘表示更改时,当我遍历时,我在磁盘上遍历。所有这些链接都讨论内存表示。@ Arne Claasen认为非叶节点(集群)是一个磁盘页,每个子节点是非叶节点内的固定大小。然后给定页面#(不需要顺序!)和子页面#可以查找特定的非叶(和/或子页面)。“诀窍”是确保页面已经加载到内存中(如果需要的话)——例如,在连续页面之前读取。一个真正聪明的引擎可能会试图减少碎片;或者将其作为一个周期性的“重建”阶段。@Arne Claassen这种B树的“块”结构以及它如何融入IO是它受欢迎或类似任务的原因之一。所以基本上我使用文件系统指针在节点周围手动进行内存映射?将磁盘视为堆并手动跟踪我可以将东西放在哪里我已经看过Berkeley DB和Tokyo Cabinet的源代码,虽然它们都可能是很棒的产品,但作为学习底层基础知识的代码库,它们并没有帮助我:(也许你应该看看基本规范()。这详细解释了代码的作用。。。