我想请问一个关于文件结构设计的问题,网上完全搜索不到这方面的东西

clonne 发布于 2012/07/03 18:57
阅读 356
收藏 0

很多软件都有自己的文件结构、比如SQLite的db、Windows的PE、JVM的class等等等等,我想知道的,就是文件结构设计方面的问题。

我在网上搜索文件结构方面的问题,几乎没有任何说明,不是c语言的文件操作就是什么xx文件结构。所以我来OSC上问大家。我想知道的,就是如何设计文件结构、和怎么操作高度结构化的文件。

比如c,c的文件操作有fopen、fclose、fread、fwrite、fseek、ftell、这六个就可以完全文件的所有操作了,但是如何用这些操作高度结构化的文件呢?

首先是这样:我正在设计一个数据文件的结构,这个结构必须是可增长的,当然不能用覆写的方式,因为文件的数据量可能上几十MB,所以只能用动态的方式。我能想到到方式就是用fopen(fname, "wb+")方式打开,需要更新的时候写入到一个地方,需要读取的时候从一个地方读取。但是问题就来了,如何才能不冲突?因为这个数据文件是有Object组成的,每个Object有一个Key,有一个Value,这个Value可以是链表、集合、字符串、字节数组、链表和集合可以包含Object。所以每一个Object的大小就会不一样,这样的话,两个Object之间就会冲突,如果在ObjectA插入新数据,很可以覆盖到ObjectB的第一条数据。如果每一个Object相隔很远的话,或许没事,但是浪费空间,而且数据量增长后还是会冲突。那么有其他的方法吗?而且我还需要建立Object的索引,因为每一个Object的Key值是唯一的。在每一个读取/写入的可能都需要更新文件,那么如何设计这个文件结构来支持这种更新呢?一次更新可能是删除 Object、新建Object、插入Value、删除Value、等等,我最大的困惑就是怎么让这些Object不发生位置的冲突,不能因为一个Object数据量大就覆盖另一个Object,这些Object是连续存储的,是否有另一个更好的方式组织这些Object的存储?

很显然,我是在做一个面向文档的Key-Value数据库,我没有经验,我最大的困惑就是文件结构这块。如何设计一个可增长的、支持索引的文件结构,又如何安排这些Object的存储,如何对数据更新。在第一个版本,我使用的是加载、保存的方式,也就是加载一个数据文件,然后程序更新,然后保存,这种方式很简单,但是正式使用是绝对不行的,因为数据量很可能会有几十MB、几百MB。所以我必须改成动态的方式,打开一文件,在操作的同时更新文件,所以我现在就面临上面的问题。

有关文件结构设计这一方面,网络上几乎没有任何相关的问题,真的很困惑

加载中
0
中山野鬼
中山野鬼
楼主知道逻辑地址、物理地址、线性地址的差异吗?如果不知道,可以GOOGLE一下。然后列在OSC上。或许你列完,你就知道你困惑的地方应该用什么方案了。。
0
clonne
clonne

刚了解了一下SQLite的文件结构,发现是b-tree和b+tree。

难道btree真的是最适合数据文件结构的吗

0
中山野鬼
中山野鬼

引用来自“clonne”的答案

刚了解了一下SQLite的文件结构,发现是b-tree和b+tree。

难道btree真的是最适合数据文件结构的吗

别总认为别人的方案就是唯一方案。你先把原理搞清楚,然后充分描述自己的问题,之后得到的方案就是最好的。其他方案都SB,无论是哪个牛人写的,因为他们不是为你的问题写的。
0
泡不烂的凉粉
泡不烂的凉粉

楼主知识面还不够宽。 对文件操作只知道那几个还是不够的。

列举的操作是操作系统对上层应用提供的接口。 具体到存储部分,操作系统还提供了其他操作方式。

至于数据库组织方式。 并非只有一种。 Btree 和 这种数据组织方式多用在索引上。

0
Dr.Who
Dr.Who

少年,大学时操作系统和数据库没好好听吧。

Key-Value模型目前最好的就是B+树吧。

不规则模型参考Linux的文件系统。

返回顶部
顶部