我的问题是关于在没有任何数据库或序列化框架的情况下,按偏移量访问专用文件中的数据.虽然教科书上说,建议按块访问数据,例如一次检索/刷新4KiB(或更大,取决于特定设备),但有时我对它的必要性感到困惑.
我见过许多数据库项目使用块感知设计来管理数据,例如从磁盘读取/写入数据一次,而不是实际请求的字节.
存储器/磁盘和系统缓冲区现在由操作系统/硬件控制,程序员不能直接控制块的移入/移出,尽管有FileDescriptor.sync()
个.
因此,即使程序按块访问数据,这增加了复杂性,也可以通过OS机制消除该工作.相反,如果程序只使用偏移量访问数据,而不考虑块,底层操作系统可能会像往常一样帮助调度块检索.更不用说某些编程语言采用复杂的内存模型,可能会影响磁盘访问,比如Java.
我知道它对ACID的块/缓冲区管理很有帮助,但我想知道这种设计是否也是为了提高效率.
我搜索了网站,但没有得到任何线索.请注意一些关键词,我为我的无知感到抱歉.
虽然以下的答案已经解决了我的困惑,但我觉得我有责任把问题说得更清楚,使这个职位更切合社会需要.
我的困惑部分源于现有的开放文件格式,比如Parquet.但是,我看到它使用了可配置的固定长度页面,后面是一个碎片大小的头.我想知道这个文件是不是从一个块的开头就存储了,would the header make the following page splii a little over the block?因为页面占用一个块的大小.
再举个例子,
假设我正在构建一个数据库系统,使用Java.数据库使用特定的文件格式,由16 KiB的固定长度块组成.我的任务是实现对一个涉及大约FileChannel.write
个字节的记录的更新.在已知记录位置的情况下,我可以直接用FileChannel.write
写入(假设没有其他记录受到影响),或者检索整个块(供以后使用)并重写整个16 KiB.在这种特定的模式下,写入这FileChannel.write
个字节是否比写入整个块更有效?
希望这篇文章能让文章更加合理.