如何有效处理大文件中间的插入或删除?

Posted

技术标签:

【中文标题】如何有效处理大文件中间的插入或删除?【英文标题】: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 字节——如果仍然重写整个文件,成本会非常高。因此,拥有大文件的软件通常会自行处理对文件的修改。比如,

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

为了兼容性,文件系统只提供了对文件的一些基本操作,除了中间的insertremove,文件编辑者或文件所有者必须自己进行优化。

以上是关于如何有效处理大文件中间的插入或删除?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地逐项比较两个大 XML 文件?

Linux下清空或删除大文件内容的5种方法

如何有效恢复误删的HDFS文件

使用 JSON 对象解析和处理大文件的更有效方法

如何(有效地)以地图为值插入地图?

如何在hadoop map reduce作业中有效地缓存大文件?