我想将几个条目存储到一个文件中(为读取优化),并为其提供一个好的数据结构,这似乎是一个B+树。它提供了一个O(log(n)/log(b))访问时间,其中b是一个块中的条目数。
描述B+树的文献很多,但总的来说,基于块的存储系统还存在一些问题。也许有人能给我指明正确的方向或者回答以下几个问题:
pread(fd, buf, n * BLOCK_SIZE, p * BLOCK_SIZE) ( n,p是整数)之类的调用来确保始终读取完整的块?非常感谢,
克里斯多夫
发布于 2011-06-20 21:27:36
通常,
想到这个规则的一个例外是ReiserFS,它将小文件直接放入文件系统结构(如果我记得的话,它就是一棵B+树!)对于非常小的文件来说,这实际上是一种可行的优化,因为数据已经在内存中而没有另一次查找,但也可以是反优化,这取决于具体情况。
mmap只是将页面映射到您的地址空间中(可能会根据您的保护标志在写上标记它们)。因此,mmap总是至少一样快,而且通常更快。mmap也比较舒服,但它的缺点是,当它需要获取更多内存中没有的页面时,它可能会被阻塞(但是,对于任何没有被锁定在内存中的应用程序或数据,这通常都是正确的)。另一方面,read会在你告诉它的时候阻止它,而不是其他。在Windows环境下,情况也是如此,只有在Windows下的内存映射文件在高并发性下不能很好地扩展,因为缓存管理器序列化everything.
是必要的。
发布于 2011-06-20 21:27:21
支持延迟分配的
如果您使用的是直接IO (它绕过操作系统的缓存),则不使用mmap。大多数数据库不使用mmap,也不使用直接IO。
直接IO意味着页面不会通过OS的页面缓存,它们根本不会被OS缓存,也不会将其他块从OS缓存中推出来。这也意味着所有的读写都需要在块边界上完成。块边界有时可以通过文件系统上的statfs调用来确定。
大多数数据库似乎都认为它们应该自己管理自己的页面缓存,并且只使用操作系统进行物理读/写。因此,它们通常使用直接和同步的IO。
著名的莱纳斯·托瓦尔兹( Linus )不同意这种做法。我认为供应商这样做确实是为了在不同的OSs之间实现更好的行为一致性。
发布于 2011-06-20 20:46:10
https://stackoverflow.com/questions/6417119
复制相似问题