为什么文件的就地编辑比创建新文件慢?

时间:2018-01-04 20:44:15

标签: performance io filesystems inplace-editing

正如您在this回答中所看到的那样。看起来像编辑文本文件比创建新文件,删除旧文件以及从另一个文件系统移动临时文件并重命名它需要花费更多的时间。更不用说在同一个文件系统中创建一个新文件,只需重命名它。我想知道背后的原因是什么?

2 个答案:

答案 0 :(得分:2)

因为在您编辑文件时,您正在为写入和阅读打开相同的文件。但是当你使用另一个文件时。您只能从一个文件中读取并写入另一个文件。 当您打开文件进行读取时,其内容将从磁盘移至内存。然后,当您想要编辑文件时,您可以更改磁盘中文件的内容,以便更新内存中的内容以防止数据不一致。但是当你使用新文件时。您不必更新内存中第一个文件的内容。您只需读取整个文件一次,然后写入另一个文件。并且不要更新任何东西。删除文件也需要很短的时间,因为您只需将其从文件系统中删除,并且不会将任何位写入磁盘中文件的位置。重命名也是如此。移动也可以非常快速地完成,具体取决于文件系统,但很可能没有移除和重命名那么快。

还有另一个更重要的原因。

当您从第一行的开头删除数字时,所有其他字符必须稍微向后移动。然后,当您再次从第二行删除数字时,该点之后的所有字符都必须向后移动,因为字符必须是连续的。如果您只想更改某些字符,那么就地编辑会更快点亮。但是,由于您在每次删除时更改文件的长度,因此所有其他字符都必须移位,这需要花费很多时间。它并不完全像这样,根据您的操作系统和文件系统的实现,它会更复杂,但这背后的想法。这就像数组操作。从数组中删除单个元素时,必须移动数组的所有其他元素。因为它是一个数组。相比之下,如果您要从链表中删除元素,则不需要移动其他元素,但文件的实现类似于数组,因此就是这样。

答案 1 :(得分:0)

虽然tgwtdt的回答可能会给出一些好的见解,但并不能解释所有问题。这是一个140MB文件的反例:

$ time sed 's/a/b/g' data > newfile
real    0m2.612s

$ time sed -i -- 's/a/b/g' data 
real    0m9.906s

为什么这是一个反例,你可能会问。因为我将a替换为b,这意味着替换文本具有相同的长度。因此,不需要移动任何数据,但它仍然需要大约四倍的时间。

虽然tgwtdt给出了一个很好的理由,说明为什么通常需要更长的时间,但这是一个一般情况下无法100%回答的问题,因为它取决于实现。