Обновить два связанных файла на диске «безопасным» способом? - PullRequest
3 голосов
/ 28 марта 2011

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

Обновление будет выглядеть примерно так:

UpdateFirstFile() - первый файл обновлен .....

UpdateSecondFile() - второй файл обновлен ...

какие методы следует использовать, чтобы убедиться, что либо ОБА файлы, либо ОБНОВЛЕНИЕ файлов не обновляется?

Оба файла являются плоскими файлами(размером 20 [МБ] каждый).Я знаю, что база данных могла бы решить эту проблему, но я обращаю внимание на ее использование по причинам, связанным с накладными расходами (каждая таблица потребовала бы гораздо больше 20 МБ для хранения, и у меня недостаточно места и у меня есть тысячи таких файлов)..).

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 28 марта 2011

Общий подход заключается в реализации транзакций с некоторым журналом отката.

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

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

Таким образом вы обеспечите атомарность операции обновления. Я оставлю читателям любые другие части ACID , которые вам нужны.

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

2 голосов
/ 28 марта 2011

Делайте то, что делают движки СУБД.

Запишите «порядковый номер обновления» в каждом файле.

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

Если порядковые номера не совпадают, это логически эквивалентно тому, что файл не был записан.Удалите файлы и используйте резервные копии.

Если порядковые номера gree, они логически эквивалентны обоим написанным.

0 голосов
/ 28 марта 2011

Оба файла являются плоскими файлами (размером 20 [МБ] каждый). Я знаю, что база данных будет решил эту проблему, пока я обратите внимание, используя один из-за накладных расходов (каждая таблица потребует гораздо больше чем 20 [МБ] для хранения, и я не хватает места и имеют тысячи таких файлы ...).

Вы можете попробовать формат HDF5 (предназначен для хранения и организации больших объемов числовых данных) для хранения обоих наборов данных в одном файле или для хранения всех ваших данных (все файлы 1000-х). Это может быть проще, чем переопределение транзакций базы данных.

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