Есть несколько способов сделать это; как правило, требуется только одно предположение, что небольшие записи (<4k) являются атомарными. Например, вот как CouchDB делает это: </p>
- Заголовок 4k содержит, помимо прочего, смещение файла корня BTree, содержащего все данные.
- Файл только для добавления. Когда требуются обновления, запишите обновление в конец файла, за которым следуют любые модифицированные узлы BTree, вплоть до корневого. Затем очистите данные и запишите новый адрес корневого узла в заголовок.
Если программа умирает во время записи обновления, но до написания заголовка, лишние данные в конце файла отбрасываются. Если это не удается после записи заголовка, запись завершена, и все хорошо. Поскольку файл предназначен только для добавления, это единственные сценарии сбоя. Это также имеет преимущество, заключающееся в обеспечении управления несколькими параллельными версиями без блокировок чтения.
Когда файл увеличивается слишком долго, просто считайте все «живые» данные и запишите их в новый файл, а затем удалите оригинал.