Почему редактирование файла на месте происходит медленнее, чем создание нового файла?

Как вы можете видеть в этом ответе. Кажется, что редактирование текстового файла на месте занимает гораздо больше времени, чем создание нового файла, удаление старого файла и перемещение временного файла из другой файловой системы и переименование его. Не говоря уже о создании нового файла в той же файловой системе и просто переименовании. Мне было интересно, что является причиной этого?

2 ответа

Решение

Потому что, когда вы редактируете файл на месте, вы открываете один и тот же файл как для записи, так и для чтения. Но когда вы используете другой файл. Вы только читаете из одного файла и пишете в другой файл. Когда вы открываете файл для чтения, его содержимое перемещается с диска в память. Затем, после того как вы захотите отредактировать файл, вы измените содержимое файла на диске, чтобы содержимое, которое у вас есть в памяти, было обновлено во избежание несогласованности данных. Но когда вы используете новый файл. Вам не нужно обновлять содержимое первого файла в памяти. Вы просто читаете весь файл один раз и пишете другой файл один раз. И не обновляйте ничего. Удаление файла также занимает очень мало времени, потому что вы просто удаляете его из файловой системы и не записываете биты в местоположение файла на диске. То же самое касается переименования. Перемещение также может выполняться очень быстро в зависимости от файловой системы, но, скорее всего, не так быстро, как удаление и переименование.

Есть и еще одна более важная причина.

Когда вы удаляете числа из начала первой строки, все остальные символы должны быть немного сдвинуты назад. Затем, когда вы удаляете числа из второй строки снова, все символы после этой точки должны быть сдвинуты назад, потому что символы должны быть последовательными. Если вы хотите просто изменить некоторые символы, редактирование на месте будет освещено быстрее. Но так как вы меняете длину файла при каждом удалении, все остальные символы должны быть сдвинуты, и это занимает так много времени. Это не совсем так, и это намного сложнее в зависимости от реализации вашей операционной системы и вашей файловой системы, но в этом-то и заключается идея. Это как операция с массивом. Когда вы удаляете один элемент из массива, вы должны сдвинуть все остальные элементы массива. Потому что это массив. Напротив, если вы должны были удалить элемент из связанного списка, вам не нужно было сдвигать другие элементы, но файлы реализованы аналогично массивам, вот и все.

Хотя ответ tgwtdt может дать несколько хороших идей, он не все объясняет. Вот пример счетчика для файла размером 140 МБ:

$ 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% для общего случая, поскольку он зависит от реализации.

Другие вопросы по тегам