|
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
|
|
Запись логов в файл. Последствия для памяти04.11.2024, 22:06. Показов 5615. Ответов 65
Метки нет (Все метки)
Вечер добрый!
У меня давно есть некий код, который я использую для логгирования своих приложений. Суть его в том, что при инициализации логгера задается максимальное количество строк для файла и приложение передает в него по одной строке, которая добавляется в конец файла. Каждый раз при добавлении проверяется, превысили ли мы максимально допустимое количество строк и если да, то логгер удаляет самую верхнюю строку текстового файла и т.д. При добавлении каждой строки происходит процедура открытия и закрытия файла. Подскажите пожалуйста, есть ли принципиальная разница в том, оставлять файл открытым или открывать и закрывать его при каждом добавлении сроки? Интересуют нюансы работы с памятью, в частности, не происходит ли при открытии и закрытии записи какой-то инфы в файл, что при частых манипуляциях может затирать досмерти ячейки памяти и т.п. Всем спасибо за участие!
0
|
|
| 04.11.2024, 22:06 | |
|
Ответы с готовыми решениями:
65
Запись логов в файл SpringBoot и запись логов в файл. - не пишет |
|
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
|
||
| 04.02.2025, 13:45 [ТС] | ||
|
Rius,
0
|
||
| 04.02.2025, 15:58 | ||
|
Вставлю свои 5 копеек.
a13428711, не заморачивайтесь такой ерундой как подгонка данных под размер кластера. Сегодня накопитель один, завтра другой. Вы пишите код на языке высокого уровня, вот и мыслите высокоуровнево, прислушивайтесь к советам по организации самого логирования, а оптимизацией пускай занимается контроллер накопителя.
1
|
||
|
|
|||||||
| 04.02.2025, 19:07 | |||||||
|
Не по теме:
Т.е. оптимизация сводиться к "ничего не трогай!" и установке оригинального образа винды, а не очередную мега-сборку. Если закупаться Samsung EVO/PRO -- будет жить подольше, но и цена соответствующая. - кластер 4КБ. - файл 6КБ, физически он на диске занимает 8КБ (это даже в свойствах файла можно глянуть) - дозаписываете 8КБ. Первые 4КБ файла никто не трогает. Следующий кластер имеет свободных 2КБ. Допустим дозаписывает в этот же кластер (прям физически, но может и выделить новый). Нам нужно ещё записить 6КБ - выделяем ещё два кластера. Один заполняется полностью, второй также -- только 2КБ. Теперь у нас новый конечный кластер заполненый наполовину. Файл весом 14КБ на диске теперь занимает 16КБ. 1. В БД есть log-файл, который отвечает за изменения данных. Грубо говоря выполнили 100500 раз UPDATE который ни на бит не поменял размер логически, но вот фактически файл БД выросли на 10ГБ. Т.е. записуються изменения рядом, т.к. это в сотню раз быстрее, чем править случайное место в файлах. 2. некоторый таблицы намерено выносят в ОЗУ.
0
|
|||||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||
| 06.02.2025, 09:39 | ||
|
Функция Seek() даст команду по положению в байтах и сама ОС определит какие кластеры нужно считать/дописать/переписать. Очевидно что тут всё упрётся в оптимизации самой ОС и драйвера файловой системы, как там они конкретно Seek() обработают, но не думаю что алгоритмы кардинально претерпели изменения со времен 70-х годов. С SSD разница может быть только в том, что после чтения кластера запись будет производиться уже в совсем другой, чтобы балансировать износ ячеек памяти, но это настолько глубоко скрыто от глаз даже на уровне API ОС, что не имеет смысла рассматривать. Как и было написано выше - Seek() для любого размера файла будет занимать одинаковое время , так как по сути это лишь манипуляция с MFT в памяти.
0
|
||
|
|
|
| 06.02.2025, 13:06 | |
|
belalugoci, речь была не поиск самих файлов по таблицам на диске и не про механизм этого поиска/чтения/записи.
Обсуждался сам факт работы с конкретным файлом при операциях дозаписи в него (в конец, в начало, середину..). Т.е. чтобы дописать в конец - необходимо этот "конец" определить путем считывания (просматривания) файла. Для вставки в середину - нужно найти эту "середину", затем "раздвинуть" блоки данных и вставить нужное между ними. Именно физически вставить, а не просто указать индексом в таблице что вот этот вот текст "находится в середине".
0
|
|
|
|
|
| 06.02.2025, 13:12 | |
|
Таким образом происходит процесс поиска -> выделение "хвоста" от этого места и копирование его в буфер -> перезапись в это место нового фрагмента -> вставка скопированного в буфер "хвоста".
Т.е. частично или полностью файл перезаписывается. Но работать всякий раз с файлом не выгодно, поэтому есть предположения, что при всех этих операциях удобнее считать весь файл целиком в память, затем произвести с ним необходимые операции и затем весь же записать обратно. Что фактически и означает перезапись файла целиком.
0
|
|
|
|
|||
| 06.02.2025, 13:17 | |||
|
Мы же говорим про текстовый файл в котором, допустим, нужно сперва найти какое-то слово/символ. Это значит что файл нужно просматривать с начала и до нахождения этого, вплоть до конца, если такого не встретилось.. Добавлено через 1 минуту
0
|
|||
|
|
|||
| 06.02.2025, 13:27 | |||
|
Про то что дозапись происходит в бинарном виде по таблицам MFT - нигде ни слова нет. Вставка в конец самый "легкий" вариант такой обработки.
0
|
|||
|
|
|
| 06.02.2025, 13:32 | |
|
В случае логов "поиск" состоит в чтении данных из таблицы файлов, где точно указана длина файла и где искать последний байт. Зачем писать очевидное?
Это не чтение всего файла с самого начала до обнаружения признакам конца. Логи в конец и пишутся. Добавлено через 1 минуту Тут иногда спрашивают, как вставить ноды в большой xml файл без чтения его всего в память. Вот там всё плохо.
0
|
|
|
|
|
| 06.02.2025, 13:42 | |
|
Rius, так я и не утверждаю что поиск == чтению. Тем не менее, создается поток в котором определяется этот конец. Ну или ребята из MS нагло врут в своей официальной документации...
Добавлено через 7 минут Зная начало файла и его длину - можно сразу перенести указатель в конец, что собственно и делает Seek. Зачем употребили слово поиск в данном случае - загадка.
0
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||
| 06.02.2025, 20:08 | |||||
|
условно это будет Seek(N), Read(M), Seek(N), Write(K+M) Где N это место вставки, M - все данные до конца файла, K - вставляемый кусок
0
|
|||||
|
|
|
| 06.02.2025, 20:14 | |
|
belalugoci, зачем вы мне объясняете эти вещи, которые я знаю еще "со школы"?
Я говорю, что они происходят "под капотом", чем иногда вызывают реальное перемещение байтов в файле на диске. Т.е. это работает не всегда так, как кажется. Добавлено через 1 минуту StringBuilder.Append
0
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||||||
| 06.02.2025, 20:25 | |||||||||||
|
формально, если у вас файл - это контейнер, например это база данных, весит она например 5 Пб (петабайт), то вам проще делать SeekN) контролируя размер "окон" изменяемых данных. Но это уже абстракция как и файловая система, но на больших данных от этого не уйти, например так делает 1С, так делает MSSQL. Но в любом случае для чтения файла достаточно буфера в 1 килобайт например и тут размер самого файла не имеет значения, а когда найдёте позицию в файле уже будете делать Seek() осмысленно. вроде там всё просто и понятно, по сути работает как индексатор для массива. Добавлено через 4 минуты
0
|
|||||||||||
|
|
|
| 06.02.2025, 20:35 | |
|
belalugoci, вы как-то не о том говорите. Мои тезисы относятся не столько к вопросу автора, сколько к затеянной некоторое время назад беседе в этой теме, относительно этих процессов.
И говорю я не за то как это работает в понимании инструкций к методам, а так, как происходит на самом деле с точки зрения файловой системы. Добавлено через 4 минуты Давно наткнулся на дебаты относительно этого, и там мало было сказать "дописывает в конец" и все. Т.е. ровно то, что сказано в оф. документации. А если копнуть глубже, то становится не так все гладко.
0
|
|
|
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
|
|
| 06.02.2025, 20:55 | |
|
Запись логов в файл из службы Windows
Уровни логирования SpringBoot и запись логов в файл. - не пишет :( Запись "логов" в файл Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
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) в массовой культуре принято понимать. . .
|