Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么就地编辑文件比创建新文件慢?_Performance_Io_Filesystems_Inplace Editing - Fatal编程技术网

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

Performance 为什么就地编辑文件比创建新文件慢?,performance,io,filesystems,inplace-editing,Performance,Io,Filesystems,Inplace Editing,正如你在回答中所看到的。似乎就地编辑文本文件比创建新文件、删除旧文件、从另一个文件系统中移动临时文件并重命名要花费更多的时间。更不用说在同一个文件系统中创建一个新文件并重命名它了。我想知道这背后的原因是什么?因为当你在原地编辑一个文件时,你正在打开同一个文件进行写入和读取。但是当你使用另一个文件时。您只能从一个文件读取数据,然后写入另一个文件。 当您打开一个文件进行读取时,它的内容会从磁盘移动到内存中。之后,当您想要编辑文件时,您可以更改磁盘中文件的内容,以便更新内存中的内容,以防止数据不一致。

正如你在回答中所看到的。似乎就地编辑文本文件比创建新文件、删除旧文件、从另一个文件系统中移动临时文件并重命名要花费更多的时间。更不用说在同一个文件系统中创建一个新文件并重命名它了。我想知道这背后的原因是什么?

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

还有另一个更重要的原因


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

虽然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%回答的问题,因为它依赖于实现。

@yukashimahuksay我可以,但它毫无意义。它不起作用。只是一个空文件LOL,好的,我做了,但请解释一下目的。时间几乎无法衡量。0064s@yukashimahuksay下面是我用来创建文件的内容:
rmdata.txt;对于i,单位为美元(seq 10000000);DoEcho 1234443$i,asdfgdf>>data.txt;完成
使用它并完成所有您想要的实验。:)