本帖最后由 shigaofei1 于 2011-11-15 12:04:28 编辑

解决方案 »

  1.   

    根据什么说操作系统中文件的存储是线性的?知道或看过FAT,NTFS的分配单元,4k,8k?
    至少猜猜他们是作什么用的。
      

  2.   

    链表结构 解决不了这个问题
    这个问题是 实际的文件存储问题打个比方文件 A点处存储了一个长度为L的数据
    那么我要修改该数据 结果还是一样啊,
    还是要移动该数据向后的所有数据啊。如果我留下足够大的字节空间给每一个结构而且何况 我单独的一个区块还要动态添加新的Object
    所以在一定程度上可以解决但又会导致文件空间的浪费
      

  3.   

    既然想“设计一个单文件数据库的文件”,为什么不参考别人的数据库存储管理?这个领域,学术上已经非常成熟,资料和文献也非常的丰富。比如说微软SQL的页和区体系结构?
    http://msdn.microsoft.com/zh-cn/library/cc280360.aspx
      

  4.   

    根据进一步的搜索 查看 各项资料...
    现在 知道 基本上 数据库 貌似 都是 固定块划归固定大小的
    就好像 我们 定义一个 新的表 都要输入 类型,大小(长度)等相关信息。恩,看来即使是 想Oracle这样的数据库 也没有什么更好的策略,尽管Oracle很成功当某区域 信息失效时会,被标识。以备后用...
    而不是将后面的所有数据向后挪...
      

  5.   

    方案一:获取 磁盘扇区簇并且自己管理,在必要的时候修改簇指针 方案二:对数据文件进行预划分,然后使用索引值进行true/false 和文件分块指针集管理
    方案二比较容易实现,但是并不是很节约空间。
    方案一是最好的,但是技术上有难点,主要是 .net操作扇区可能比较困难,至少 似乎没有搜索到相关已有的实现...
      

  6.   


    你说的对,也不对。其实你翻开最近30年的任何一本数据库操作系统教程,都可以看到有磁盘管理系统作为基础。你不能说它是关系数据库了,所以就不用考虑磁盘管理基本概念了,应该搞什么更加时髦的概念了。关系数据库的磁盘管理,与操作系统的磁盘管理是两回事,但是也有相互借鉴的意义,甚至很大程度上是相同的(最近两年超级时髦的Mongo数据库则是16M一个磁盘数据块的)。关系数据库的磁盘块往往是操作系统的磁盘块大小的整倍数,例如可能是256K或者4M一个数据块都有可能。数据库保持两个链表,一个是所有的有数据的的磁盘块,一个是所有的空闲磁盘块。有数据的磁盘块,例如一个1024为大小的块吧,它可能保存一条或者多条记录。当记录修改的时候,如果要扩大,但是原来的空间放不下了,就可以转移到其它的磁盘块上去;如果空间放得下一条记录,那么记录之间有一点空隙也是正常的,没有必要立刻移动记录的位置。
      

  7.   

    有数据的磁盘块,例如一个1024为大小的块吧   -->  有数据的磁盘块,例如一个1024K为大小的块吧例如说我们知道SQL Server的记录最大也不到8K(实际上比8K小几十个字节,显然磁盘块里边需要有管理信息),而Mongo则是16M。后者经过了仔细的测试,证明16M要比8K高效多了(当然也是因为管理方式不同)。磁盘块里边当然可以有多条记录,而不是只能有一条。
      

  8.   

    看来你很难想象磁盘中的链表如何保存。举个例子。比如说1024K为一个块,那么你每一次以随机存取方式去读取数据库文件时,都是以1024K的整倍数为偏移量来开始读取1M字节的。假设你规定文件中前128个字节保存有一些主要管理信息,例如两个链表的第一个块的块号,那么读取第1001块数据那么当然就是从(1001-1)*1024+128字节开始读取1M的字节。而每一个磁盘块的前4个字节可以是指向之前的磁盘块号,第5~8个字节指向之后的磁盘块号,这就可以形成链表。
      

  9.   


    16M=256*64KB
    一个byte可以表示256个数字
    操作系统内存粒度大小是64KB我怀疑Mongo可能是为了
    1.索引时长度更短时间更快
    2.内存读取时按64KB为单位整块读取更加方便
    3.16M是一个适中的数据
    4.节约空间,256个内存块 这个数字多也不算多,少也不算少。
    在建立索引时只需要一个字节即可标出数据块位置,
      

  10.   

    没搞混 我说的是内存映射文件
    32位操作系统 内存粒度为每单元 64KB,微软建议使用这个粒度的整数进行内存操作。
    当然实际的我还是调用GetSystemInfo函数获取的这个值并且验证了网上的说法。
      

  11.   


    mongo不索引这些16M磁盘映像,而且完全无需索引。上面我也从来没有说过有什么关系数据库需要索引这个,顶多是需要链表而你,你怎么随便就给说成是索引了呢?关于你说的有关“字节”的一些理由,我不太理解。数据库管理的关键是建立高层次的管理机制,至于性能需要以测试为准,而不是空洞地抠字节概念。比如说你认为256字节比较“合理”,人家可能测试出512字节合理,谁更合理?当然是以测试为准。
      

  12.   

    我说的不是数据库中我们平时说的索引,而是
    比如 某一个数据位于 
    假设16M文件单元真的分为256个块,每个块分为64KB,而这64KB中可以存储若干数据如果我要表示这个某个数据的存储位置的话:存储这个数据时记录将16M文件这个单元的256个分块的第几块,64KB中的第几字节开始,然后是数据长度这样 我先排除 16M的文件单元的编号,如果我要 获取这个数据的位置以及长度的话可以这样表示:
    1个字节表示块在文件中的位置,2个字节表示数据在块中的位置,再用一个或者两个字节表示长度。这样在查找的时候利用这个“索引”就可以迅速找到相应的位置,至于256这个数 是因为 一个Byte总共可以表示256个数,如果您说512的话就要用两个字节了,两个字节仅仅表示512的话是很浪费的。数据库必须在保证 检索速度的同时尽量 减少空间的使用。
      

  13.   


    为啥要用,2个字节表示数据在块中的位置呢,我是这么想的,
    64KB内存页面=2个字节,也就是 ushort所能表示的最大值对于mongo 还真是不太清楚,看来 我得去 大肆搜索一翻 看看有没有相关的技术分析文章