Разница между записью в файл атомарно, а не - PullRequest
36 голосов
/ 24 апреля 2010

Какая разница в том, чтобы записывать файлы на iPhone в атомарном режиме в target-c, и нет, есть ли разница в производительности между ними?

Заранее спасибо!

Ответы [ 3 ]

50 голосов
/ 24 апреля 2010

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

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

Производительность по стоимости минимальна. Во время записи у вас будет две копии файла. Замена файла - очень простая операция на уровне файловой системы.

Редактировать: спасибо zneak

1 голос
/ 07 марта 2015

Запись атомарно занимает больше шагов - дополнительно создается вспомогательный файл. Класс NSString Ссылка объясняет:

Если ДА, получатель записывается во вспомогательный файл, а затем вспомогательный файл переименован в path. Если НЕТ, получатель написан прямо к пути. Опция YES гарантирует этот путь, если он существует в все, не будет поврежден, даже если система будет зависать во время письменная форма.

Вот пример в случае pLists:

[array writeToFile:path atomically:YES];

когда "ДА", тогда pList обновляется только один раз, даже если вы запускаете код несколько раз в XCode,

[array writeToFile:path atomically:NO];

когда "НЕТ" обновляется столько раз, сколько вы запускаете один и тот же код (повторное обновление).

0 голосов
/ 05 августа 2011

Файловые системы не должны прибегать к циклам записи / переименования для атомарных записей. Файловые системы, которые имеют семантику блокировки, позволяют вам «блокировать» части или весь файл, а в некоторых случаях даже делать что-то вроде добавления к файлу, чтобы помочь с атомарностью.

@ Рэнди, оба твоих предположения о фрагментации могут быть неверными. В большинстве файловых систем запись всего файла и его закрытие приведет к менее фрагментированному файлу, а запись большого файла за одну запись определенно приведет к лучшему использованию больших блоков. Если вы имели в виду, что файловые блоки с большей вероятностью «ползут» по диску, это зависит от предпочтений макета в вашей файловой системе. Если вы пишете на флэш-память, вы, вероятно, захотите, чтобы файловая система проскальзывала по доступному хранилищу как своего рода самовыравнивание записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...