powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C++: атомарно записать в файл 128MB.
16 сообщений из 41, страница 2 из 2
C++: атомарно записать в файл 128MB.
    #39306942
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНапоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим.

Текущее простое и сердитое решение, которое вроде бы это гарантирует.
Кто считает, что не гарантирует - скажите конкретно где и почему.

запись
- хотим дописать 76 кб данных
- добавляем в конец файла header постоянного размера, в который пишем hash данных + размер данных (76*1024) + hash самого header перед ним.
- вызываем fsync() -- это как барьер памяти, не позволяющий переупорядочить операции записи перед ним и за ним
- дописываем наши данные
- вызываем fsync()

чтение после сбоя
1. если header в неадеквате (файл кончился раньше размера header (он фиксир.), hash хидера не совпало) - считаем всё пространство файла далее пустым
2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их HASH не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header
можно тупо размер файла хранить где-то дополнительно
скажем в заголовке файла или в отдельном месте
после записи куска данных в файл апдейтить этот размер
что <= размера то в консистентном состоянии
что > размера -- это кусок кала
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306944
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedВася Уткинпропущено...

1. Ошибки ФС могут быть только при изменении размера файла, при условии, что сжатие в ФС отключено.
2. Возможно понадобятся оба: обязательно OS fsync() и возможно C++ flush() : http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync/2340641#2340641] http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync/2340641#2340641
Например, так: http://stackoverflow.com/questions/676787/how-to-do-fsync-on-an-ofstream] http://stackoverflow.com/questions/676787/how-to-do-fsync-on-an-ofstream
3. А тут надо уточнить, "не значит обязательно в конец" - это значит перезаписывать середину, или сначала сдвигать все последующие блоки, а затем писать в свободную середину?
1. Ок
2. Я не юзаю промежуточных буферов, сразу отправляю данные OS через ::write(), мне одного fsync() хватит
3. Не понял что вы хотите, если задача успешно вроде бы решена. Как хотите - можете поставить себе задачу придумать такую структуру данных и алгоритм, которые работают через запись в середину, тогда и разгребайте грабли сами и описывайте алгоритм. Решение с дописыванием в конец header + data решило задачу, я обошёлся без необходимости что-то ворочать в середине. Но если очень хочется - условия это не запрещают. Лишь бы новые данные каким-то образом консистентно добавились в хранилище без утечки "дисковой памяти" и с возможностью половинчатые записи потом увидеть.
ниче не решило
твой хеадер может теоретичнски являться куском кала
просто у них структура чудесным образом совпала
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306945
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или скажем

1 создаем доп файл, записываем в него размер файла, в кот нужно писать
2 пишем в файл
3 удаляем доп. файл

после сбоя
1 если доп файла нет то все ок
2 если доп выйл есть то не все ок, ок тоько столько байт сколько записано в доп файле
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306952
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedНапоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим.

Текущее простое и сердитое решение, которое вроде бы это гарантирует.
Кто считает, что не гарантирует - скажите конкретно где и почему.

запись
- хотим дописать 76 кб данных
- добавляем в конец файла header постоянного размера, в который пишем hash данных + размер данных (76*1024) + hash самого header перед ним.
- вызываем fsync() -- это как барьер памяти, не позволяющий переупорядочить операции записи перед ним и за ним
- дописываем наши данные
- вызываем fsync()

чтение после сбоя
1. если header в неадеквате (файл кончился раньше размера header (он фиксир.), hash хидера не совпало) - считаем всё пространство файла далее пустым
2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их HASH не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header
можно тупо размер файла хранить где-то дополнительно
скажем в заголовке файла или в отдельном месте
после записи куска данных в файл апдейтить этот размер
что <= размера то в консистентном состоянии
что > размера -- это кусок кала
Хотелось бы кализировать только не записавшуюся часть файла, а не все ранее накопленные данные.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306953
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedпропущено...

1. Ок
2. Я не юзаю промежуточных буферов, сразу отправляю данные OS через ::write(), мне одного fsync() хватит
3. Не понял что вы хотите, если задача успешно вроде бы решена. Как хотите - можете поставить себе задачу придумать такую структуру данных и алгоритм, которые работают через запись в середину, тогда и разгребайте грабли сами и описывайте алгоритм. Решение с дописыванием в конец header + data решило задачу, я обошёлся без необходимости что-то ворочать в середине. Но если очень хочется - условия это не запрещают. Лишь бы новые данные каким-то образом консистентно добавились в хранилище без утечки "дисковой памяти" и с возможностью половинчатые записи потом увидеть.
ниче не решило
твой хеадер может теоретичнски являться куском кала
просто у них структура чудесным образом совпала
Хедер кусок кала - это описано в предусмотрениях.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306956
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...

можно тупо размер файла хранить где-то дополнительно
скажем в заголовке файла или в отдельном месте
после записи куска данных в файл апдейтить этот размер
что <= размера то в консистентном состоянии
что > размера -- это кусок кала
Хотелось бы кализировать только не записавшуюся часть файла, а не все ранее накопленные данные.



ну так и есть же, вроде все правильно
кусок данных в файле до size -- валидный
или ты нам че-то недоговариваешь
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306957
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedпропущено...

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



ну так и есть же, вроде все правильно
кусок данных в файле до size -- валидный
или ты нам че-то недоговариваешь
Всё. Теперь понял.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306958
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...

ниче не решило
твой хеадер может теоретичнски являться куском кала
просто у них структура чудесным образом совпала
Хедер кусок кала - это описано в предусмотрениях.

ты его с какого-то перепуга в конец пишешь а потом данные
как после сбоя ты определяешь по какому смещению у тебя header?
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306959
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...




ну так и есть же, вроде все правильно
кусок данных в файле до size -- валидный
или ты нам че-то недоговариваешь
Всё. Теперь понял.

если у тебя не абстрактный файл а какой-то свой,
я бы заголовок в начале сделал, и в нем поле с последним валидным размером данных
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306968
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedпропущено...

Хедер кусок кала - это описано в предусмотрениях.

ты его с какого-то перепуга в конец пишешь а потом данные
как после сбоя ты определяешь по какому смещению у тебя header?
Header предваряет каждую запись. Header-ов в файле много.
Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла).
Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306969
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedпропущено...

Всё. Теперь понял.

если у тебя не абстрактный файл а какой-то свой,
я бы заголовок в начале сделал, и в нем поле с последним валидным размером данных
Головой seek-ать дорого по времени.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306974
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...


ты его с какого-то перепуга в конец пишешь а потом данные
как после сбоя ты определяешь по какому смещению у тебя header?
Header предваряет каждую запись. Header-ов в файле много.
Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла).
Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку.

уу какая штука
прям лог с историей

тогда можно сделать еще так
ты не дописывай в конец файла каждый раз
а делай всегда новый файл

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

а когда читаешь -- читай из всех файлов в определенном порядке

иногда у тебя будет запускаться процесс, который собирае данные из всех файлов в один
а ненудные файлы удаляет
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306987
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...


ты его с какого-то перепуга в конец пишешь а потом данные
как после сбоя ты определяешь по какому смещению у тебя header?
Header предваряет каждую запись. Header-ов в файле много.
Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла).
Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку.
Футер ещё добавь в каждую запись с каким-нибудь хэшем, чтоб при разрушении файловой системы не пострадать
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39307201
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилReciprocatedпропущено...

Header предваряет каждую запись. Header-ов в файле много.
Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла).
Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку.
Футер ещё добавь в каждую запись с каким-нибудь хэшем, чтоб при разрушении файловой системы не пострадать
без разницы, куда хеш писать, в хедер или в футер

мне эта структура больше транзакшн лог напоминает, чем хранилище данных
ну да, хрен с ним, его можно консолидировать время от времени, работать будет
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39307347
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reciprocated,
формируется новый файл, потом старый подменяемся новым путем удаления старого и переименования нового. почти атомарно.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39307350
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНапоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим.
ИМХУ ты журнал транзакций изобретаешь. Возьми документацию по какой-нибудь СУБД (MSSQL, SQLite, Postgre и т.д.) и почитай как там проблема решена. Для всех СУБД эта проблема актуальна.
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C++: атомарно записать в файл 128MB.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]