Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2009, 12:03   #11
cowboy
Форумчанин
 
Регистрация: 12.03.2009
Сообщений: 109
По умолчанию

Цитата:
Сообщение от s.Creator Посмотреть сообщение
(зачем для записи 1400 точек массив в 200000 что умножить на 30 символов в строке составит 6 MB).
[/CODE]проверял только на компиляцию.
тут просто чтение идет из файла..ФАйл около 5 его весит.. Около 120000 строк.. Строки каждую минуту добавляются .. Нужно вывести ПОСЛЕДНИЕ 1400 строкюЮДля это нуна весь файл в массив загнать..

Цитата:
Сообщение от cowboy Посмотреть сообщение
тут просто чтение идет из файла..ФАйл около 5 его весит.. Около 120000 строк.. Строки каждую минуту добавляются .. Нужно вывести ПОСЛЕДНИЕ 1400 строкюЮДля это нуна весь файл в массив загнать..
млин мужики спасайте.. Вот эта беда мне строит график нужным мне данных.. Но при запуске приложения в режиме компиляции на второй итерации таймера вылетает ошибка
Код:
procedure TPagesDlg.Timer4Timer(Sender: TObject);

var
arb_st:array[1..200000] of string;
arb_b,arb_s,date,time,arb_cutt,arb_price:array[1..w+100] of string;
arb:textfile;
st,ti,temp,temp1,temp2:string;
i,j,count,p,point,koef,y,z,u,k,start:integer;
iv_d:array[1..w+100] of integer;
series,series1:TLineSeries;
PropuskStrok: integer;
begin
AssignFile(arb,'D:\log\GAZP_ARB_PROGRAMM.LOG');
reset(arb);
u:=0;

i:=0;


PropuskStrok := strtoint(combobox1.text);

While not EOF(arb) do begin
ReadLn(arb,st);

if u=PropuskStrok  then begin
i:=i+1;
arb_st[i]:=st;
u:=0;
end;

u:=u+1;
end;

CloseFile(arb);
count:=i;

p:=0;
j:=0;




for i:=count-w+5 to count do begin

if length(arb_st[i])>0 then begin
j:=j+1;
arb_cutt[j]:=arb_st[i];
date[j]:=copy(arb_st[i],1,8);
time[j]:=copy(arb_st[i],10,6);
delete(arb_cutt[j],1,16);
p:=pos(' ',arb_cutt[j]);
if p>0 then arb_b[j]:=copy(arb_cutt[j],1,p);
delete(arb_cutt[j],1,p);
p:=pos(' ',arb_cutt[j]);
if p>0 then arb_s[j]:=copy(arb_cutt[j],1,p);
delete(arb_cutt[j],1,p);
p:=pos(' ',arb_cutt[j]);
if p>0 then arb_price[j]:=copy(arb_cutt[j],1,p);
end;
end;

if chart8.SeriesCount > 0 then begin
 chart8.Series[0].Free;
chart8.Series[1].Free;
 end;

With chart8 do begin
View3D:=false;
Visible:=True;
MarginBottom:=1;
Marginleft:=1;
Marginright:=2;
Margintop:=1;
end;

With Chart8.Title.Text do
begin
Clear;
Add('GP');
end;

series:=TLineSeries.Create(chart8);
series1:=TLineSeries.Create(chart8);
chart8.RemoveAllSeries;

for i:=1 to j do begin
series.AddXY(i,strtofloat(arb_b[i]),time[i],RGB(0,0,255));
series1.AddXY(i,strtofloat(arb_s[i]),time[i],RGB(255,0,0));
end;

chart8.AddSeries(series);
chart8.AddSeries(series1);



end;
причем какой то косяк происходит именно с
chart8.Series[0].Free;
chart8.Series[1].Free;

..ПОтомучто без этого фсе работает нормально

А может это быть из-за того что в файл я пишу одной программой, а читауже своим приложением? может они просто не делят его друг с другом?
Изображения
Тип файла: jpg Ошибка.jpg (27.7 Кб, 139 просмотров)

Последний раз редактировалось Stilet; 21.08.2009 в 12:04.
cowboy вне форума Ответить с цитированием
Старый 19.08.2009, 18:37   #12
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от cowboy Посмотреть сообщение
тут просто чтение идет из файла..ФАйл около 5 его весит.. Около 120000 строк.. Строки каждую минуту добавляются .. Нужно вывести ПОСЛЕДНИЕ 1400 строкюЮДля это нуна весь файл в массив загнать..
А почему Вам не понравился мой вариант, когда в
Код:
iv_str:array[1..w] of string;
читается весь файл и в результате там остается не больше w последних строк, которые успешно считываются.
___________________________________ ___________________________________ ____
Замените
Код:
if chart8.SeriesCount > 0 then begin
 chart8.Series[0].Free;
chart8.Series[1].Free;
 end;
на
Код:
  while chart.8SeriesCount > 0 do
    chart8.Series[0].Free;
и попробуйте найти одно отличие:
Почему (в Вашем случае) это не работает:
Код:
if chart8.SeriesCount > 0 then begin
 chart8.Series[0].Free;
chart8.Series[1].Free;
 end;
А а это должно заработать
Код:
Код:
if chart8.SeriesCount > 0 then begin
 chart8.Series[0].Free;
chart8.Series[0].Free;
 end;

Последний раз редактировалось s.Creator; 19.08.2009 в 21:15.
s.Creator вне форума Ответить с цитированием
Старый 20.08.2009, 14:59   #13
cowboy
Форумчанин
 
Регистрация: 12.03.2009
Сообщений: 109
По умолчанию

Цитата:
Сообщение от s.Creator Посмотреть сообщение

Код:
  
  While not EOF(index) do
  begin
    ReadLn(index,st);
    if u = PropuskStrok then
    begin
      IncCykle(i);
      iv_str[i] := st;
      u:=0;
    end
    else
      u := u+1; // 0 - все строки, 1 - через одну ...
  end;
мне кажется таким кодом мы не получим в точности последние W строк файла..МЫ получим (w-какой то промежуток), где какойто промежуток будет заполнен данными из предыдущего цикла

Мое приложение все равно продолжает жрать оперативку. FREE для серий почему то не помогают...СТрою около 8 графиков на разных чартах..Вот фрагмент одной процедуры для построения чарта
Код:
procedure TPagesDlg.Timer4Timer(Sender: TObject);

procedure create_arb(chart:Tchart;path:string;name:string);
var
arb_st:array of String;
arb_b,arb_s,date,time,arb_cutt,arb_price:array of String;
arb:textfile;
st,ti,temp,temp1,temp2:String;
i,j,count,p,point,koef,y,z,u,k,start:integer;
series,series1:TLineSeries;
PropuskStrok: integer;
begin
setlength(arb_st,200000);
setlength(arb_b,w+100);
setlength(arb_s,w+100);

setlength(date,w+100);
setlength(time,w+100);
setlength(arb_cutt,w+100);
setlength(arb_price,w+100);


AssignFile(arb,path);

reset(arb);
u:=0;

i:=0;

PropuskStrok := strtoint(combobox2.text);

While not EOF(arb) do begin
ReadLn(arb,st);

if u=PropuskStrok  then begin
//i:=i+1;
arb_st[i]:=st;
u:=0;
i:=i+1;
end;

u:=u+1;
end;

CloseFile(arb);
count:=i-1;

p:=0;
j:=0;

for i:=count-w+5 to count do begin

if length(arb_st[i])>0 then begin
arb_cutt[j]:=arb_st[i];
date[j]:=copy(arb_st[i],1,8);
time[j]:=copy(arb_st[i],10,6);
delete(arb_cutt[j],1,16);
p:=pos(' ',arb_cutt[j]);
if p>0 then arb_b[j]:=copy(arb_cutt[j],1,p);
delete(arb_cutt[j],1,p);
p:=pos(' ',arb_cutt[j]);
if p>0 then arb_s[j]:=copy(arb_cutt[j],1,p);
delete(arb_cutt[j],1,p);
p:=pos(' ',arb_cutt[j]);
if p>0 then arb_price[j]:=copy(arb_cutt[j],1,p);
j:=j+1;
end;
end;

   while chart.SeriesCount > 0 do  begin
    chart.Series[0].free;
    end;

With chart do begin
View3D:=false;
Visible:=True;
MarginBottom:=1;
Marginleft:=1;
Marginright:=2;
Margintop:=1;
end;

With Chart.Title.Text do
begin
Clear;
Add(name);
end;

series:=TLineSeries.Create(chart);
series1:=TLineSeries.Create(chart);

for i:=0 to j-1 do begin
series1.AddXY(i,strtofloat(arb_s[i]),time[i],RGB(0,0,255));
end;

chart.AddSeries(series1);
arb_st:=nil;
arb_b:=nil;
arb_s:=nil;
date:=nil;
time:=nil;
arb_cutt:=nil;
arb_price:=nil;
end;


begin
create_arb(chart8,'D:\log\GAZP_ARB_PROGRAMM.LOG','GP');
create_arb(chart9,'D:\log\SBER03_ARB_PROGRAMM.LOG','LUK');
create_arb(chart10,'D:\log\LKOH_ARB_PROGRAMM.LOG','SBER');
end;
И еще по поводу ошибки.. У меня всего две формы..ПО нажатию кнопочки на форме 1 появляется табы и на них уже нахадятсЯ таймеры для построения графиков..2 таймера строят графики, третий пишет в файл данные(из которых строятся графики) .. Четвертый просто сравнивает ячейки..Так вот..Данные же в мое приложение поступают из другой программы( назовем ее главной программой) по DDE, которое начинает качать при нажатии клавиши ..Затем эти данные с формы 1 по таймеры перебрасываются на табы..Если по ДДЕ экспорт не идет(клавиша не активирована) то мое приложение совершенно свободно строит графики и
никаких ошибкок массива не вылетает.. Но как только я запускают экспорт-начинаютчерез не которое время появлятьяс ошибки... Принт такого зверя выкладываю..
Изображения
Тип файла: jpg Ошибка.jpg (38.1 Кб, 143 просмотров)

Последний раз редактировалось Stilet; 21.08.2009 в 12:04.
cowboy вне форума Ответить с цитированием
Старый 20.08.2009, 19:00   #14
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от cowboy Посмотреть сообщение
мне кажется таким кодом мы не получим в точности последние W строк файла..МЫ получим (w-какой то промежуток), где какойто промежуток будет заполнен данными из предыдущего цикла
пусть W = 50, а в файле 60 строк.
сперва массив заполнится полностью затем первые 10 элементов.
Если мы считаем с массива 11-50, 1-10 то это и будут последние 50 строк.
Можете поиграться разными значениями констант в прилагаемом тестовом проекте.

P.S. Обнаружил в коде приведенном в моем посте № 10 пару ошибок (опечаток) - к сожалению он уже не редактируется:
Код:
procedure IncCykle(var ind: integer);
Код:
for j:=1 to count do
По поводу дальнейшего поиска утечек памяти.
Вопрос она постоянно растет или при возникновении ошибок.
У Вас код не защищен try finally, соответственно если будет исключение до освобождения массивов то будет утечка (а массивы не маленькие).
Не совсем понятно про ошибки (на принте не возможно прочитать ошибку и в какой именно строке кода она возникает? ) и передачу данных по DDE/
Что означает?:
Цитата:
Затем эти данные с формы 1 по таймеры перебрасываются на табы
куда именно.
Про поиск утечек - почитайте хотябы эту статью http://gunsmoker.blogspot.com/2009/05/blog-post_24.html.

Еще раз глянул последний ваш код ( пост 17 ) - создается два графика а добавляется один - второй будет потерян в памяти
Вложения
Тип файла: zip test.zip (2.2 Кб, 7 просмотров)

Последний раз редактировалось s.Creator; 20.08.2009 в 19:23.
s.Creator вне форума Ответить с цитированием
Старый 21.08.2009, 10:03   #15
cowboy
Форумчанин
 
Регистрация: 12.03.2009
Сообщений: 109
По умолчанию

Цитата:
Сообщение от s.Creator Посмотреть сообщение
пусть W = 50, а в файле 60 строк.
сперва массив заполнится полностью затем первые 10 элементов.
Если мы считаем с массива 11-50, 1-10 то это и будут последние 50 строк.
Можете поиграться разными значениями констант в прилагаемом тестовом проекте.
Тьфу млин.,Как фсе просто оказывается

Цитата:
Сообщение от s.Creator Посмотреть сообщение
По поводу дальнейшего поиска утечек памяти.
Вопрос она постоянно растет или при возникновении ошибок.
У Вас код не защищен try finally, соответственно если будет исключение до освобождения массивов то будет утечка (а массивы не маленькие).
Не совсем понятно про ошибки (на принте не возможно прочитать ошибку и в какой именно строке кода она возникает? ) и передачу данных по DDE/
Что означает?:
Из проги(Главной) идут данные через DDE ..Вообще этот метод вывода данный идет по умолчанию на лист EXCEL..Но в DELPHI сэмулирован как бы эксель...И данные идут в него в стринггрид. Дальше таймер данные раскидывает в другие стринггриды на табах.
Память растет постоянно и равномерно

Цитата:
Сообщение от s.Creator Посмотреть сообщение


Еще раз глянул последний ваш код ( пост 17 ) - создается два графика а добавляется один - второй будет потерян в памяти
Спасибо..Исправил..

Последний раз редактировалось Stilet; 21.08.2009 в 12:05.
cowboy вне форума Ответить с цитированием
Старый 21.08.2009, 15:20   #16
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Проверил работу с графиками
Если не забывать их добавлять и удалять то память не растет
Смотри вложение
Вложения
Тип файла: zip TestChart.zip (3.3 Кб, 7 просмотров)
s.Creator вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
можно ли вылечить оперативку? Don_Omar Компьютерное железо 16 23.03.2009 14:27
Как уменьшить мое первое окно BOPOHA Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 29.12.2007 17:57
Какое-то приложение жрет трафик пыхта4ог Свободное общение 22 13.11.2007 15:12
DBE жрет оракловкие ошибки, как их выудить ? Iuliy БД в Delphi 2 21.03.2007 13:44
ООП мое первое начало cross Общие вопросы Delphi 1 18.03.2007 21:58