Форум: "Начинающим";
Текущий архив: 2008.12.28;
Скачать: [xml.tar.bz2];
ВнизКак избавиться от 100% загрузки CPU? 5Мб лога в секунду. Найти похожие ветки
← →
SkyN (2008-11-18 11:39) [0]Cейчас:
Программа1 посылает данные для лога (5 Мб (45 тыс.сообщений) в секунду) по средствам SendMessage(ExternalTraceWindows,WM_COPYDATA,
Программа2, в основном потоке получает данные, и накопив их (сейчас копит 1 Мб) во втором потоке пишет их в файл.
Возможно, есть менее ресурсоемкий способ передачи данных, чем WM_COPYDATA.
Возможно, есть не ресурсоемкий способ сжатия данных. Лог очень однородный, rar сжимает его в 1000 раз.
Возможно, есть другие идеи у Вас.
Программа1procedure Send(const Msg: String);
var
aCopyData: TCopyDataStruct;
begin
aCopyData.dwData := 0;
aCopyData.cbData := StrLen(PChar(Msg)) + 1;
aCopyData.lpData := PChar(Msg);
if ExternalTraceWindows=0 then ExternalTraceWindows := FindWindowEx(0, 0, PChar("TTraceWindow"), PChar("TraceWindow"));
if SendMessage(ExternalTraceWindows,WM_COPYDATA,0,Longint(@aCopyData))<>777 then begin
ExternalTraceWindows := FindWindowEx(0, 0, PChar("TTraceWindow"), PChar("TraceWindow"));
SendMessage(ExternalTraceWindows,WM_COPYDATA, 0,Longint(@aCopyData))
end;
end;
procedure Log(const Level: Integer; const Msg: String);
var
S: String;
begin
if Level<MinLogLevel then exit;
EnterCriticalSection(OldCriticalSection);
try
if OldNow=Now then S := ""
else begin
DateTimeToString(S,"yyyy.mm.dd hh:mm:ss.zzz",Now);
S := S + #13#10;
OldNow := Now;
end;
finally
LeaveCriticalSection(OldCriticalSection);
end;
if Level=LogError then S := S + "ERROR ";
if GetCurrentThreadID <> MainThreadId then S := S +"Th#"+IntToHex(GetCurrentThreadId,1)+#9;
S := S + Msg;
Send(S);
end;
Программа2
procedure TTraceWindow.WMCopyData(var Msg: TWMCopyData);
begin
Msg.Result := 777;
if Assigned(LogThread) then
LogThread.Add(PChar(Msg.CopyDataStruct.lpData));
if CheckBox1.Checked then begin
while Memo1.Lines.Count>100 do Memo1.Lines.Delete(0);
Memo1.Lines.Add(PChar(Msg.CopyDataStruct.lpData));
end;
end;
procedure tLogThread.Add(const Msg: PChar);
var
i: integer;
begin
CriticalSection.Acquire;
try
i := 0;
While (ASize+i+2)<MaxABSize do begin
if Msg[i]=#0 then break;
a[ASize+i] := Msg[i];
inc(i);
end;
a[ASize+i] := #13;
a[ASize+i+1] := #10;
ASize := ASize+i+2;
if ASize>(MaxABSize div 2) then Event.SetEvent;
finally
CriticalSection.Release;
end;
end;
procedure tLogThread.execute;
procedure WriteToFile;
var
F: file;
tmp: PChar;
begin
if Asize=0 then exit;
CriticalSection.Acquire;
try
tmp := b;
b := a;
a := tmp;
Bsize := Asize;
Asize := 0;
SizeOfLog := SizeOfLog + Bsize;
if SizeOfLog > 100*1024*1024 then LogFileName;
Event.ResetEvent;
finally
CriticalSection.Release;
end;
try
if Bsize > 0 then begin
AssignFile(F, FileName);
{$I-} Reset(F,1); {$I+}
if IOResult = 0 then Seek(F, FileSize(F))
else Rewrite(F,1);
if IOResult = 0 then BlockWrite(F,B^,Bsize);
CloseFile(F);
end;
except
trace("except при записи в файл");
LogFileName;
end;
end;
begin
while not terminated do begin
case Event.WaitFor(60000) of
wrTimeout : WriteToFile;
wrAbandoned : Break;
wrError : Break;
wrSignaled : WriteToFile;
end;
end;
end;
← →
Slym © (2008-11-18 16:37) [1]SkyN (18.11.08 11:39)
45 тыс.сообщений в секунду
это нереально... система только на переключение задач уйму времени убъет если справится :) (один Send - одно переключение)
может имеет смысл и в первой проге не дергаться по каждому чиху а тоже копить?
и вообще сообщения не для этих "транспортных" целей...
← →
Sergey13 © (2008-11-18 16:51) [2]> [0] SkyN (18.11.08 11:39)
> Лог очень однородный
Так может писать только неоднородности? Кому нужны 5метров в секунду с сообщением "все ОК"?
← →
SkyN (2008-11-18 17:18) [3]> Slym © (18.11.08 16:37) [1]
Копить сообщения в первой проге - попробую.
а как лучше пересылать из проги в прогу, если WM_COPYDATA не для этих целей. Насколько другие способы менее ресурсоемкие?
> Sergey13 © (18.11.08 16:51) [2]
ну не просто "все ОК" :) хотя есть и такие сообщения
← →
Sergey13 © (2008-11-18 17:23) [4]> [3] SkyN (18.11.08 17:18)
> ну не просто "все ОК" :)
"все ОК" для примера. Можно писать время изменения параметра и старое/новое значение. Не зная структуры лога тут трудно советовать. Но в любом случае "Лог очень однородный" - это плохой лог. ИМХО.
← →
qqq (2008-11-18 17:33) [5]
> а как лучше пересылать из проги в прогу, если WM_COPYDATA
> не для этих целей.
pipe?
← →
Тын-Дын © (2008-11-18 21:25) [6]MMF?
← →
Сергей М. © (2008-11-18 21:50) [7]
> pipe?
Да , 45 килохлама в секунду - это pipeц.
← →
Юрий Зотов © (2008-11-18 23:51) [8]В бытность ЕС ЭВМ снимала у нас ночное машинное время одна контора - ну и я по ночам там же, на нашем ВЦ частенько торчал. Работали от этой конторы 2 программера, бились они над своим детищем, наверное, месяца 2, еженощно - и вот в одну прекрасную ночь выходит один из них из машзала, абсолютно счастливый. И тащит в руках стопку бумаги толщиной так сантиметров 20 (а формат ее, по-нынешнему, где-то А3). И говорит - уррра!!! заррработало!!! Ну я его спрашиваю - а в распечатке-то, такой огромной, что у тебя? Как что, говорит - результаты, конечно. И показывает - а там сплошные цифры, цифры, цифры... на стопке формата А3 толщиной 20 см... Блин, говорю, и что же ты теперь с этими результатами делать-то будешь? Ты понимаешь, что для того, чтобы их обработать, тебе либо жизни не хватит, либо еще одну (а может, и не одну) программу писать надо?
И тут... я даже пожалел, что сказал это. Сначала у него медленно-медленно сползла с лица счастливая улыбка, потом вытянулось само лицо, а потом на нем проступило буквально отчаяние. Понял парень, что же такое он сотворил... что несколько месяцев авральной работы просто зазря пропали.
Вот и сабж - не тот ли самый случай? Если каждую секунду в лог загоняется "Война и мир", то что потом с этим логом делать?
← →
Германн © (2008-11-19 00:09) [9]
> Если каждую секунду в лог загоняется "Война и мир", то что
> потом с этим логом делать?
Пожинать разумное, доброе, вечное!
P.S.
А рулоны бумаги с числами нам приходилось вручную обрабатывать пока в лаборатории на появилась первая, хм, "эвм" :)
← →
Slym © (2008-11-19 05:43) [10]qqq (18.11.08 17:33) [5]
pipe
+1... у пайпа буфер свой есть он и будет кешировать блокируя потоки только при переполнении/пустоте и если его растянуть на 1 сек данных... то поидее будет минимум переключений
это за 3 с половиной минуты прога рождает гиг инфы... за сутки с небольшим будет засран мой старенький пятисотник? ужос! видео регистратор месяц его заполняет, а ты за сутки :)
← →
KilkennyCat © (2008-11-19 08:08) [11]а это вообще возможно? 45 сообщений в миллисекунду? под виндами?
← →
Anatoly Podgoretsky © (2008-11-19 08:52) [12]> KilkennyCat (19.11.2008 8:08:11) [11]
всего лишь 40 мегабит в секунду.
← →
Дуб © (2008-11-19 13:16) [13]Может он в лог пишет случайную последовательность, которую потом будет продавать?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.12.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c