Re[83]: MS забило на дотнет. Питону - да, сишарпу - нет?
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.10.21 13:25
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Поэтому кеширование для таких файлов отключается.

Нет. Так никто не делает.

S>>В MMF мы не можем этого гарантировать.


НС>Так не надо лог в MMF писать, о чем и речь.

Это как раз понятно. Лог пишется в режиме stream: добавляем всегда в конец. Но отсутствие кэширования (== flush на каждый write) гарантированно убъёт производительность при модификациях.
Представьте себе выполнение операции update employee set salary = salary * 1.05 where region = @region.
То, что вы предлагаете, означает выполнение flush лога N раз для N записей, попавших под предикат.
Это — очень плохое решение, т.к.
— на HDD мы получим ограничение быстродействия в ~100 изменений в секунду, т.е. транзакция, трогающая всего лишь 1000 записей, будет выполняться не меньше 10 секунд.
— на SSD мы получим многократные перезаписи одной и той же страницы, очень быстро изнашивая диск.

S>>2. Мы добавляем к логу запись (@x, oldX, newX); (без flush)


НС>Так что тут если какое то буферизирование при записи в лог и делать, то только чисто программное, на уровне прикладного кода.

По большому счёту, нам всё равно, как устроена буферизация при записи в лог. Там главное — возможность сделать честный flush() в нужный приложению момент.
Отключение буферизации делается в первую очередь для того, чтобы избежать бессмысленного перекладывания данных из одного буфера в другой, т.к. нам всё равно известны точные моменты, когда надо всё же сделать flush.
То есть в дотнете / windows можно реализовать два способа:
1. FileStream.Flush + FlushFileBuffers (неэффективно)
2. Открыть файл c флагами FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH. Тогда можно делать просто FileStream.Flush().
Подчеркну: в обоих случаях мы делаем Flush лога на на каждое изменение, а только на каждый commit transaction. То есть транзакция, которая трогает 1000 записей, будет выполняться ~10ms (если выбранный размер буфера достаточен для того, чтобы избежать промежуточных сбросов в процессе исполнения).

НС>И, в любом случае, MMF для файла лога бессмысленен и бесполезен, там все равно запись и чтение строго последовательные.

Речь идёт про MMF для файла данных.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.