Джерри прав, если это просто Ctrl-C, о котором вы беспокоитесь, вы можете игнорировать SIGINT за периоды за раз. Если вы хотите быть доказательством против смерти процесса в целом, вам нужен какой-то минимальный журнал. Чтобы поменять два элемента:
1) Добавьте запись в структуру управления в конце файла или в отдельный файл, указав, какие два элемента файла вы собираетесь обменять, A и B.
2) Скопируйте A на место царапины, запишите, что вы сделали это, заподлицо.
3) Копия B над A, а затем записать в царапанию пространстве, что вы сделали это, флеш
4) Копия с нуля пространства над В.
5) Удалить запись.
Это O (1) дополнительное пространство для всех практических целей, поэтому по большинству определений оно по-прежнему считается как место. Теоретически запись индекса равна O (log n), если n может быть сколь угодно большим: на самом деле это очень малый log n, а разумное время работы оборудования/времени ограничивает его выше на 64.
Во всех случаях, когда я говорю " flush ", я имею в виду фиксацию изменений« достаточно далеко ». Иногда ваша базовая операция флеша только очищает буферы внутри процесса, но фактически не синхронизирует физический носитель, поскольку он не очищает буферы полностью через драйверы/аппаратные уровни OS/device. Этого достаточно, когда все, о чем вы беспокоитесь, это смерть процесса, но если вы беспокоитесь о внезапных демонтажах СМИ, вам придется скрыться за водителем. Если вас беспокоит отказ от питания, вам придется синхронизировать аппаратное обеспечение, но это не так. С ИБП или если вы считаете, что отключения питания настолько редки, вы не против потери данных, это нормально.
При запуске проверьте место царапины для любых записей «swap-in-progress».Если вы найдете его, выясните, как далеко вы добрались, и завершите обмен оттуда, чтобы вернуть данные в состояние звука. Затем снова начните сортировку.
Очевидно, что здесь проблема с производительностью, так как вы делаете в два раза больше записей записей, как и раньше, а флеши/синхронизация может быть удивительно дорогой. На практике ваш вид на месте может иметь некоторые сложные операции с движущимися элементами, включающие множество свопов, но которые вы можете оптимизировать, чтобы каждый элемент не попадал на место царапины. Вам просто нужно убедиться, что перед перезаписью каких-либо данных у вас есть где-то ее копия и запись о том, куда должна идти эта копия, чтобы вернуть файл в состояние, в котором содержится ровно одна копия каждого элемента.
Джерри также прав, что истинная сортировка на месте слишком сложна и медленна для большинства практических целей. Если вы можете сэкономить некоторую линейную долю исходного размера файла в качестве пространства скреста, у вас будет гораздо лучшее время с его сортировкой.
Основываясь на ваших разъяснениях, вам не нужны никакие операции с флеш-памятью даже с помощью сортировки на месте. Вам нужно иметь место с нуля в памяти, которое работает одинаково и что ваш обработчик SIGINT может получить доступ, чтобы получить данные в безопасности до того, как выйдет, а не восстановит при запуске после ненормальный выход, и вам нужно получить доступ к этой памяти в безопасном сигнале (что технически означает использование sig_atomic_t
, чтобы отметить, какие изменения были сделаны). Тем не менее, вы, вероятно, лучше со слиянием, чем с истинным видом на месте.
Я думаю, вы должны спросить, что важнее? Пространство или прерывание процесса.Если вам нужно убедиться, что файл не поврежден, вам нужно как-то отслеживать его прогресс и предыдущие состояния - это займет больше места, чем файл. –
Чтобы быть в безопасности. Сделайте копию и отсортируйте копию. Я могу; t образ файловой системы будет иметь проблемы с другим 40GB –
@Martin: ваше воображение не работает так, как мое. На моем основном диске я в настоящее время имею 36,4 ГБ бесплатно. –