【问题标题】:How to efficiently handle insertion or deletion in the middle of a big file?如何有效处理大文件中间的插入或删除?
【发布时间】:2016-04-20 07:47:37
【问题描述】:

InsertDelete 是在文件中间添加和删除一些数据的操作,文件大小会发生变化。

对于普通文本编辑器编辑的小文本文件,如记事本、vim、emacs,整个文本文件通过原子操作重写。具体来说,当编辑文本文件时,插入或删除一些内容(不是文件尾部),首先将文件头部到插入或删除数据的内容复制到一个新文件中;然后,复制插入的数据(删除操作省略此步骤);最后,从插入/删除位置到末尾的数据被复制到新文件中。

“插入”和“删除”是昂贵的操作,因为

普通文件系统不提供insertremove 操作,这些操作会随着文件大小的变化而修改中间的文件内容。

当涉及到一个大文件时——这里指的是一个大小超过内存大小的文件,通常超过 10G 字节——如果仍然重写整个文件,成本会非常高。因此,拥有大文件的软件通常会自行处理对文件的修改。比如,

  1. vmdk文件是VMware Workstation的虚拟文件系统排列的虚拟机镜像文件

  2. db文件是数据库文件,其数据由数据库的存储引擎操作

我的问题是这些“虚拟文件系统/存储引擎”如何有效地处理大文件中间的insertdelete 操作,以避免密集的磁盘I/O?

欢迎任何相关材料或论文。

【问题讨论】:

    标签: filesystems storage bigdata


    【解决方案1】:

    我很想知道是否有任何文件系统在两者之间进行了特定的插入/删除优化。 AFAIK 许多文件系统没有特定的优化,所有新数据(从修改位置到结束)都按顺序重新写入。

    【讨论】:

    • 为了兼容性,文件系统只提供了对文件的一些基本操作,除了中间的insertremove,文件编辑者或文件所有者必须自己进行优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多