Как правило, удаление элемента из середины файла означает переписывание всех записей после записи, чтобы использовать пространство, занимаемое элементом.
Некоторые вещи вместо этого помечают элементы, которые удалены, с некоторым недопустимым значением, чтобы определить, что слот не используется. Как правило, они даже не используют повторно удаленные слоты, так как это гораздо больше управления, чем вы можете себе представить, и в основном реализует архитектуру, подобную куче, в файле. Им нужен отдельный шаг «уплотнения», чтобы позже удалить это мертвое пространство. Microsoft Jet (как в Access) работал следующим образом.
Существует очень классная оптимизация, которая применима в некоторых случаях:
Если строки неупорядочены и имеют одинаковую длину, вы можете перезаписать запись, которую хотите «удалить», последней записью и обрезать файл.
Если строки неупорядочены, но не имеют фиксированной длины, вы можете использовать более сложный вариант этого подхода, когда вы перемещаете какую-то запись с конца, которая равна длине удаляемого элемента, так что вам нужно только перемешать Как можно меньше записей.