![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ограничить размер лог-файла программы [D7, WinXP]
Tack © (2005-02-17 19:52:00)Какой вы предложите самый производительный способ ограничить размер лог-файла программы?
Условия задачи:
1) Файл простой текстовый (Text).
2) Файл всегда открывается для дозаписи (Append)
3) Каждая новая запись занимает ровно одну строку (один WriteLn)
4) Ограничение размера - в сотнях килобайт, удалять информацию можно только строками от начала файла.
Хотелось бы не перерасходовать память, загружая лог полностью в TStringList, а писать сразу на диск по 5-10 строк, после каждой группы вызовов WriteLn вызывая Flush.
Размер файла на диске можно контролировать через апишную GetFileSize(), получив дескриптор файла с правами на чтение.
А вот как эффективнее всего удалять лишние строки из начала файла при превышении размера?
Германн (2005-02-18 02:22:00) [21]2 Anatoly Podgoretsky © (17.02.05 23:52) [14]
>Tack (17.02.05 20:23) [9]
>А это много?
Для "разбора" лога с целью выяснения чего-то - много. Копаться в "многометровом" логе - не по силам! А ведь в логе нужно именно "копаться", иначе - зачем он нужен!
Кроме того в логе (по умолчанию) может "копаться" и юзер, который многого не знает! А, в добавок, этого самого юзера заставляют высылать лог по почте! И как быть с этими "метрами"?
Anatoly Podgoretsky (2005-02-17 23:52:00) [22]Tack (17.02.05 20:23) [9]
А это много?
Alexander Panov (2005-02-17 21:46:00) [23]Разбери пример, приведенный на http://delphibase.spb.ru/в разделе "Ini-, Log- и др. спецфайлы", вопросы отпадут.
begin...end (2005-02-17 20:31:00) [24]> Tack (17.02.05 20:19) [7]
> А как работает TStringList?
Ответ - в исходниках VCL :-)
Строки (а в TStringList с каждой строкой связан ещё и объект) там хранятся в поле-массиве. Т.е. для того, чтобы получить доступ к конкретной строке, не требуется чтение всех предыдущих строк (как в текстовом файле). При удалении какой-либо строки из списка все стоявшие ниже строки смещаются на одну вверх (это медленно), но в Вашем случае даже не надо ничего удалять. Как только выяснится, что размер списка слишком велик, начинайте писать в список сначала, т.е. перезаписывать строки, находящиеся в начале спсика. Но надо
ещё хорошо подумать, как часто этот список сохранять на диск...
Tack (2005-02-17 20:30:00) [25]Всем спасибо.
Германн (2005-02-17 20:27:00) [26]Дарю идею. Имя файла для лога формировать так:
DateToStr(Date).Имя программы.log.txt
Tack (2005-02-17 20:23:00) [27]Aleks, а если файл - 5-10 МБайт?
Aleks (2005-02-17 20:21:00) [28]procedure TForm1.FormActivate(Sender: TObject);
var
i:integer;
begin
if (Если размер файла больше чем надо) then
begin
Memo1.Lines.LoadFromFile('c:\txt.txt');
for i:=0 to 3 do // сколько строк удалить, сейчас 3
Memo1.Lines.Delete(i);
Memo1.Lines.SaveToFile('c:\txt.txt');
end;
end;
Tack (2005-02-17 20:19:00) [29]А как работает TStringList? Т.е. как он в памяти размещается? И будет ли влиять большая интенсивность записи строк в лог на общую производительность системы?
begin...end (2005-02-17 20:16:00) [30]> Tack (17.02.05 20:14) [5]
Тогда, вероятно, всё же придётся TStringList пользовать. ИМХО.
Tack (2005-02-17 20:14:00) [31]неа. Все разные
begin...end (2005-02-17 20:11:00) [32]> Tack (17.02.05 20:03) [3]
В файл записываются строки фиксированной длины?
Tack (2005-02-17 20:03:00) [33]Так лучше через API файлы создавать?
begin...end (2005-02-17 19:59:00) [34]> Tack (17.02.05 19:52)
> А вот как эффективнее всего удалять лишние строки из
> начала файла при превышении размера?
ИМХО, используя текстовые файлы (Text), сделать это эффективно не получится.
Palladin (2005-02-17 19:56:00) [35]
> Хотелось бы не перерасходовать память,
? сотней килобайт ты перерасходуешь память? парень, ты на какой машине работаешь...