是否有一种在非常大的文件中添加或删除内容的快速方法

时间:2011-04-22 02:13:43

标签: language-agnostic large-files

假设我有一个非常大的文件(比如> 1GB),我想在它的中间添加一个字符。是否可以在不读取和写入整个文件的情况下执行此操作?我目前的解决方案是(伪代码):

x = 0
chunk = read 4KB chunk x of input file
if chunkToEdit = x, chunk = addCharacter(chunk)
append chunk to the output file 
x = x + 1
repeat last 4 steps until input file is fully read
delete input file
move output file to input file

虽然有效,但它会产生1GB的读数,1GB的写入可以改变单个字符。它还需要1GB的备用磁盘空间。我宁愿做的是修改需要更改的文件部分,所以我只需要读写文件的一部分(即4KB的读取和4KB的写入)。这可能(或者比我更好的解决方案)?

我认为可以通过操作系统对文件进行分段并为更改的部分创建新片段来实现此解决方案,但我不知道是否已编写此功能并向开发人员公开。

2 个答案:

答案 0 :(得分:1)

没有。文件不能那样工作。如果您需要更改文件的大小,则需要从修改点到最后操作。

除非您使用的文件格式可以干净利落地处理插入/删除,但听起来并非如此。

答案 1 :(得分:1)

在中间添加单个字符必然需要将一个字符后的所有字符移动一个字符。这必然要求您从插入点到文件末尾读取和写入所有内容。使用尽可能少的内存的方法是:

  • i = 0
  • 读取文件的最后一个( n byte * i)
  • 写回1个字符的文件
  • 我+ +
  • 重复直到达到插入点
  • 写单个字符

换句话说:将所有 n 字节块中的所有字符从一个字符开始,从结尾开始向后通过文件到插入点,然后插入字符。要插入角色的文件越往后,这个就越快。如果您经常要在文件开头附近插入,这可能不是最佳解决方案。