Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296

Запись логов в файл. Последствия для памяти

04.11.2024, 22:06. Показов 5615. Ответов 65
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер добрый!
У меня давно есть некий код, который я использую для логгирования своих приложений. Суть его в том, что при инициализации логгера задается максимальное количество строк для файла и приложение передает в него по одной строке, которая добавляется в конец файла. Каждый раз при добавлении проверяется, превысили ли мы максимально допустимое количество строк и если да, то логгер удаляет самую верхнюю строку текстового файла и т.д.
При добавлении каждой строки происходит процедура открытия и закрытия файла.
Подскажите пожалуйста, есть ли принципиальная разница в том, оставлять файл открытым или открывать и закрывать его при каждом добавлении сроки?
Интересуют нюансы работы с памятью, в частности, не происходит ли при открытии и закрытии записи какой-то инфы в файл, что при частых манипуляциях может затирать досмерти ячейки памяти и т.п.
Всем спасибо за участие!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2024, 22:06
Ответы с готовыми решениями:

Запись логов в файл
Добрый день. Есть небольшое клиент-серверное приложение на сокетах, работающее с БД. Вопрос: как лучше написать небольшой логгер,...

Запись логов в файл
Добрый день, подскажите в чём проблема, необходимо сделать след: 1. Логи с приоритетом info - пишутся только в консоль 2. Логи с...

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

65
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
04.02.2025, 13:45  [ТС]
Студворк — интернет-сервис помощи студентам
Rius,
Про Wear Leveling
Спасибо за это. В целом технологию знаю, но на Хабре нашел статью, где четко написано, что минимальный размер записи это размер страницы у ssd, которая обычно 4киб. То бишь, минимальный размер в моем случае, должен быть один кластер
0
2296 / 1612 / 400
Регистрация: 26.06.2017
Сообщений: 4,774
Записей в блоге: 1
04.02.2025, 15:58
Вставлю свои 5 копеек.
Цитата Сообщение от a13428711 Посмотреть сообщение
То бишь, минимальный размер в моем случае, должен быть один кластер
Даже если данных меньше, но выполняется их запись, то всё равно будет использован весь кластер.
a13428711, не заморачивайтесь такой ерундой как подгонка данных под размер кластера. Сегодня накопитель один, завтра другой. Вы пишите код на языке высокого уровня, вот и мыслите высокоуровнево, прислушивайтесь к советам по организации самого логирования, а оптимизацией пускай занимается контроллер накопителя.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
04.02.2025, 19:07

Не по теме:

Цитата Сообщение от Rius Посмотреть сообщение
Поддержку TRIM включили и забыли.
Для того чтобы её включить, нужно сначала выключить, т.к. она включена по умолчанию. А выключают её обычно всякие ОПТИМИЗАТОР-ШИНДОВС-БЛЭК-ЗВЕРЬ-УЛЬТРА-ЭДИШОН.EXE

Т.е. оптимизация сводиться к "ничего не трогай!" и установке оригинального образа винды, а не очередную мега-сборку.

Цитата Сообщение от golosalex Посмотреть сообщение
долговечность HDD
Как повезет. Флешки у меня дохли пачками. Диски -- пока только два HDD (причём второй пока ещё шевелиться), но нужно учитывать что они насиловались в студенческие годы на полную, в то время как SSD -- тупо под систему.

Если закупаться Samsung EVO/PRO -- будет жить подольше, но и цена соответствующая.



Цитата Сообщение от a13428711 Посмотреть сообщение
Но как именно происходит добавление?
Цитата Сообщение от Wolfdp Посмотреть сообщение
берется крайний кластер отвечающий за конец файла, в него дозаписывается сколько влезет, а дальше идет выделение новых кластеров (у нас же вроде обсуждается добавление в конец файла).
На пальцах:
- кластер 4КБ.
- файл 6КБ, физически он на диске занимает 8КБ (это даже в свойствах файла можно глянуть)
- дозаписываете 8КБ. Первые 4КБ файла никто не трогает. Следующий кластер имеет свободных 2КБ. Допустим дозаписывает в этот же кластер (прям физически, но может и выделить новый). Нам нужно ещё записить 6КБ
- выделяем ещё два кластера. Один заполняется полностью, второй также -- только 2КБ. Теперь у нас новый конечный кластер заполненый наполовину. Файл весом 14КБ на диске теперь занимает 16КБ.

Цитата Сообщение от Uswer Посмотреть сообщение
Вы пишите код на языке высокого уровня, вот и мыслите высокоуровнево
+1. Я выше писал что C# с файлом работает через десяток посредников, что сводит на нет любые ваши потуги в низкоуровневую оптимизацию.

Цитата Сообщение от a13428711 Посмотреть сообщение
опрос возник глядя на БД, в которых данные могут добавляться сотни раз в секунду, при этом они не висят в оперативной памяти ожидая сохранения, а пишутся сразу на диск
Вы на 100% уверены в этом?
1. В БД есть log-файл, который отвечает за изменения данных. Грубо говоря выполнили 100500 раз UPDATE который ни на бит не поменял размер логически, но вот фактически файл БД выросли на 10ГБ. Т.е. записуються изменения рядом, т.к. это в сотню раз быстрее, чем править случайное место в файлах.
2. некоторый таблицы намерено выносят в ОЗУ.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
06.02.2025, 09:39
Цитата Сообщение от wizard41 Посмотреть сообщение
это к порядку считывания. Как вы системе даете понять, что считывать надо с ЭТОГО места и до ЭТОГО, причем учитывая кодировки и прочую лабуду... ?
Как СИСТЕМА вставит в конец файла часть, не изучив перед этим где этот КОНЕЦ и как его интерпретировать?
файловая система имеет таблицу кластеров, то есть по сути у вас файл соотносится с размером кластера, а кластер файловой системы занимает несколько секторов диска. Поэтому если вы пишете файлы не превышая размер кластера, например у вас 16 Кб кластер, то у вас на низком уровне будет считываться 32 сектора (если у вас HDD/SSD состоит из секторов по 512 байт). Всё это в ОЗУ и этим занимается сама ОС, для вас, на высоком уровне всё это незаметно. Если вы например в эти 16 Кб сохранили файл размером в 10 Кб, то у вас будет файл в 10 Кб, хранящийся в кластере в 16 Кб и занимающий на диске 32 сектора. Когда вы дописываете что-то, ОС прочитает кластер целиком (а скорее всего несколько кластеров, которые будут кешированы) в ОЗУ, допишет например еще 2 Кб и сохранит кластер целиком. Байты писать на диск никто не будет, для ОС кластер и будет минимальным контейнером. Если вы превысили размер кластера - ОС вам выделит еще один кластер.
Функция Seek() даст команду по положению в байтах и сама ОС определит какие кластеры нужно считать/дописать/переписать. Очевидно что тут всё упрётся в оптимизации самой ОС и драйвера файловой системы, как там они конкретно Seek() обработают, но не думаю что алгоритмы кардинально претерпели изменения со времен 70-х годов. С SSD разница может быть только в том, что после чтения кластера запись будет производиться уже в совсем другой, чтобы балансировать износ ячеек памяти, но это настолько глубоко скрыто от глаз даже на уровне API ОС, что не имеет смысла рассматривать.
Как и было написано выше - Seek() для любого размера файла будет занимать одинаковое время , так как по сути это лишь манипуляция с MFT в памяти.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
06.02.2025, 13:06
belalugoci, речь была не поиск самих файлов по таблицам на диске и не про механизм этого поиска/чтения/записи.
Обсуждался сам факт работы с конкретным файлом при операциях дозаписи в него (в конец, в начало, середину..).
Т.е. чтобы дописать в конец - необходимо этот "конец" определить путем считывания (просматривания) файла.
Для вставки в середину - нужно найти эту "середину", затем "раздвинуть" блоки данных и вставить нужное между ними. Именно физически вставить, а не просто указать индексом в таблице что вот этот вот текст "находится в середине".
0
Эксперт .NET
 Аватар для Rius
13398 / 7852 / 1700
Регистрация: 25.05.2015
Сообщений: 23,869
Записей в блоге: 14
06.02.2025, 13:08
Не нужно файл просматривать весь, о чем он и написал. Seek все решает.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
06.02.2025, 13:12
Таким образом происходит процесс поиска -> выделение "хвоста" от этого места и копирование его в буфер -> перезапись в это место нового фрагмента -> вставка скопированного в буфер "хвоста".
Т.е. частично или полностью файл перезаписывается.

Но работать всякий раз с файлом не выгодно, поэтому есть предположения, что при всех этих операциях удобнее считать весь файл целиком в память, затем произвести с ним необходимые операции и затем весь же записать обратно.
Что фактически и означает перезапись файла целиком.
0
Эксперт .NET
 Аватар для Rius
13398 / 7852 / 1700
Регистрация: 25.05.2015
Сообщений: 23,869
Записей в блоге: 14
06.02.2025, 13:14
А особенно удобно, когда лог файл превышает размер озу.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
06.02.2025, 13:17
Цитата Сообщение от Rius Посмотреть сообщение
Seek все решает.
Как он решает? Он решает задачу перенести указатель на n байт туда/сюда.
Мы же говорим про текстовый файл в котором, допустим, нужно сперва найти какое-то слово/символ. Это значит что файл нужно просматривать с начала и до нахождения этого, вплоть до конца, если такого не встретилось..

Добавлено через 1 минуту
Цитата Сообщение от Rius Посмотреть сообщение
когда лог файл превышает размер озу.
а зачем лог держать все время в озу?
0
Эксперт .NET
 Аватар для Rius
13398 / 7852 / 1700
Регистрация: 25.05.2015
Сообщений: 23,869
Записей в блоге: 14
06.02.2025, 13:18
Мы говорим про запись логов.
Логи дописываются в конец файла. Никакого поиска и вставки в середину.

Я не знаю, что за идеи вы генерите.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
06.02.2025, 13:27
Цитата Сообщение от Rius Посмотреть сообщение
Я не знаю, что за идеи вы генерите.
Это я про ранние обсуждения..
Цитата Сообщение от Rius Посмотреть сообщение
Никакого поиска
Файл открывается и производится поиск конца...
Про то что дозапись происходит в бинарном виде по таблицам MFT - нигде ни слова нет.
Вставка в конец самый "легкий" вариант такой обработки.
0
Эксперт .NET
 Аватар для Rius
13398 / 7852 / 1700
Регистрация: 25.05.2015
Сообщений: 23,869
Записей в блоге: 14
06.02.2025, 13:32
В случае логов "поиск" состоит в чтении данных из таблицы файлов, где точно указана длина файла и где искать последний байт. Зачем писать очевидное?
Это не чтение всего файла с самого начала до обнаружения признакам конца.

Логи в конец и пишутся.

Добавлено через 1 минуту
Тут иногда спрашивают, как вставить ноды в большой xml файл без чтения его всего в память.
Вот там всё плохо.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
06.02.2025, 13:42
Rius, так я и не утверждаю что поиск == чтению. Тем не менее, создается поток в котором определяется этот конец. Ну или ребята из MS нагло врут в своей официальной документации...

Добавлено через 7 минут
Зная начало файла и его длину - можно сразу перенести указатель в конец, что собственно и делает Seek. Зачем употребили слово поиск в данном случае - загадка.
0
Эксперт .NET
 Аватар для Rius
13398 / 7852 / 1700
Регистрация: 25.05.2015
Сообщений: 23,869
Записей в блоге: 14
06.02.2025, 13:47
Раньше накопители были на магнитных лентах.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
06.02.2025, 13:51
Цитата Сообщение от Rius Посмотреть сообщение
Раньше накопители были на магнитных лентах.
Ну это существенно ничего не меняет, а даже наоборот - подтверждает саму суть слова Seek - "просматривать".
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
06.02.2025, 20:08
Цитата Сообщение от wizard41 Посмотреть сообщение
речь была
я знаю о чем речь и мой ответ полностью раскрывает этот вопрос.

Цитата Сообщение от wizard41 Посмотреть сообщение
Т.е. чтобы дописать в конец - необходимо этот "конец" определить путем считывания (просматривания) файла.
нет

Цитата Сообщение от wizard41 Посмотреть сообщение
Для вставки в середину - нужно найти эту "середину"
для файловой системы нет понятия "вставить в середину", вам, как программисту, придется самостоятельно этот вопрос решать.
условно это будет Seek(N), Read(M), Seek(N), Write(K+M)
Где N это место вставки, M - все данные до конца файла, K - вставляемый кусок

Цитата Сообщение от wizard41 Посмотреть сообщение
Именно физически вставить, а не просто указать индексом в таблице что вот этот вот текст "находится в середине".
именно вам, как программисту на высоком уровне абстракции ничего подобного делать не нужно, это сделает API, у вас только в качестве инструмента остаётся вызов конкретных функций. По сути это ничем не отличается от работы с массивами.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
06.02.2025, 20:14
belalugoci, зачем вы мне объясняете эти вещи, которые я знаю еще "со школы"?
Я говорю, что они происходят "под капотом", чем иногда вызывают реальное перемещение байтов в файле на диске. Т.е. это работает не всегда так, как кажется.

Добавлено через 1 минуту
StringBuilder.Append
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
06.02.2025, 20:25
Цитата Сообщение от wizard41 Посмотреть сообщение
Но работать всякий раз с файлом не выгодно, поэтому есть предположения, что при всех этих операциях удобнее считать весь файл целиком в память, затем произвести с ним необходимые операции и затем весь же записать обратно.
Что фактически и означает перезапись файла целиком.
не вижу смысла это делать, если у вас данные последовательны, а если это сериализация чего-то, и результирующий файл не будет соответствовать предыдущему до какого-то места, то да, делаете всё в памяти а потом пишете.

формально, если у вас файл - это контейнер, например это база данных, весит она например 5 Пб (петабайт), то вам проще делать SeekN) контролируя размер "окон" изменяемых данных. Но это уже абстракция как и файловая система, но на больших данных от этого не уйти, например так делает 1С, так делает MSSQL.

Цитата Сообщение от wizard41 Посмотреть сообщение
Мы же говорим про текстовый файл в котором, допустим, нужно сперва найти какое-то слово/символ. Это значит что файл нужно просматривать с начала и до нахождения этого, вплоть до конца, если такого не встретилось..
ну автор о таком вроде не говорил.
Но в любом случае для чтения файла достаточно буфера в 1 килобайт например и тут размер самого файла не имеет значения, а когда найдёте позицию в файле уже будете делать Seek() осмысленно.

Цитата Сообщение от wizard41 Посмотреть сообщение
Файл открывается и производится поиск конца...
зачем? вы просто можете дописывать данные сразу в конец без всякого поиска, файловая система, ОС и её API это позволяют.

Цитата Сообщение от wizard41 Посмотреть сообщение
Про то что дозапись происходит в бинарном виде по таблицам MFT - нигде ни слова нет.
а вам это и не нужно, это происходит автоматически, вы же находитесь выше по уровню абстракции при работе с файлами.

Цитата Сообщение от wizard41 Посмотреть сообщение
Вставка в конец самый "легкий" вариант такой обработки.
выше я написал как можно сделать дозапись в середине без полного чтения БОЛЬШОГО файла. Для небольших файлов можно и всё в ОЗУ засунуть.

Цитата Сообщение от wizard41 Посмотреть сообщение
Тем не менее, создается поток в котором определяется этот конец
https://learn.microsoft.com/ru... ew=net-8.0
вроде там всё просто и понятно, по сути работает как индексатор для массива.

Добавлено через 4 минуты
Цитата Сообщение от wizard41 Посмотреть сообщение
зачем вы мне объясняете эти вещи, которые я знаю еще "со школы"?
ну пишете вы так словно только вчера появились в этом мире.

Цитата Сообщение от wizard41 Посмотреть сообщение
Я говорю, что они происходят "под капотом"
ну если вы утверждаете что ОС бегает по файлу туда-сюда, то вы заблуждаетесь.

Цитата Сообщение от wizard41 Посмотреть сообщение
Т.е. это работает не всегда так, как кажется
когда кажется - тогда крестятся. Я знаю как это работает еще с 80-х и пока нет причин сомневаться в том что основные принципы работы не изменились. Логи - это вообще задачка для первого класса, куда всё более масштабно например с СУБД. Не зря же HP и Oracle даже собственные файловые системы изобретали.

Цитата Сообщение от wizard41 Посмотреть сообщение
StringBuilder.Append
Этот метод к обсуждению никак не подходит.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
06.02.2025, 20:35
belalugoci, вы как-то не о том говорите. Мои тезисы относятся не столько к вопросу автора, сколько к затеянной некоторое время назад беседе в этой теме, относительно этих процессов.
И говорю я не за то как это работает в понимании инструкций к методам, а так, как происходит на самом деле с точки зрения файловой системы.

Добавлено через 4 минуты
Давно наткнулся на дебаты относительно этого, и там мало было сказать "дописывает в конец" и все. Т.е. ровно то, что сказано в оф. документации. А если копнуть глубже, то становится не так все гладко.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
06.02.2025, 20:55
wizard41, тогда я не понимаю о чем вы говорите. Для меня процесс записи файлов не имеет никаких подводных камней и соотносится с документацией. Так уж сложилось что у нас HDD/SSD сильно обратно совместимы (с рядом оговорок конечно) с тем, как всё было устроено 40 лет назад. Поэтому нет особых сложностей подключить SSD (если точнее, то SD Card и CF Card) к платформе на i80286/386. Вероятно и SSD при делании через какой-то китайский контроллёр можно попробовать прикрутить. Я о том, что в этом аспекте технологии не сильно далеко ускакали от теории прошлого.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.02.2025, 20:55

Как вести запись логов в файл?
Создал такой класс: public class ExceptionLogger { private static final Logger logger =...

Запись логов в файл из службы Windows
В классе задаю StreamWriter sw = File.AppendText("Log.txt"); В методе OnStart вызываю Writetolog("onstart"); async void...

Запись логов в файл с ограниченным числом строк
Всем привет. Как лучше писать логи в файл, который должен содержать не больше 100 тыс. строк? На данным момент у меня...

Уровни логирования SpringBoot и запись логов в файл. - не пишет :(
Всем доброго дня! Столкнулся с таким вопросам... Есть приложение на SpringBoot завернутое в контейнер Docker в .yml файле...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru