如何有效处理大文件中间的插入或删除?
Posted
技术标签:
【中文标题】如何有效处理大文件中间的插入或删除?【英文标题】:How to efficiently handle insertion or deletion in the middle of a big file? 【发布时间】:2016-04-20 07:47:37 【问题描述】:Insert
和Delete
是在文件中间添加和删除一些数据的操作,文件大小会发生变化。
对于普通文本编辑器编辑的小文本文件,如记事本、vim、emacs,整个文本文件通过原子操作重写。具体来说,当编辑文本文件时,插入或删除一些内容(不是文件尾部),首先将文件头部到插入或删除数据的内容复制到一个新文件中;然后,复制插入的数据(删除操作省略此步骤);最后,从插入/删除位置到末尾的数据被复制到新文件中。
“插入”和“删除”是昂贵的操作,因为
普通文件系统不提供
insert
或remove
操作,这些操作会随着文件大小的变化而修改中间的文件内容。
当涉及到一个大文件时——这里指的是一个大小超过内存大小的文件,通常超过 10G 字节——如果仍然重写整个文件,成本会非常高。因此,拥有大文件的软件通常会自行处理对文件的修改。比如,
vmdk
文件是VMware Workstation的虚拟文件系统排列的虚拟机镜像文件
db
文件是数据库文件,其数据由数据库的存储引擎操作
我的问题是这些“虚拟文件系统/存储引擎”如何有效地处理大文件中间的insert
和delete
操作,以避免密集的磁盘I/O?
欢迎任何相关材料或论文。
【问题讨论】:
【参考方案1】:我很想知道是否有任何文件系统在两者之间进行了特定的插入/删除优化。 AFAIK 许多文件系统没有特定的优化,所有新数据(从修改位置到结束)都按顺序重新写入。
【讨论】:
为了兼容性,文件系统只提供了对文件的一些基本操作,除了中间的insert
或remove
,文件编辑者或文件所有者必须自己进行优化。
以上是关于如何有效处理大文件中间的插入或删除?的主要内容,如果未能解决你的问题,请参考以下文章