Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Не удаляется из памяти поток MemoryStream   Найти похожие ветки 

 
alex_sz   (2006-10-05 02:22) [0]

Фрагмент исходника:

     s:=memorystream.create;
     //Задаем цикл.
     //В цикле сохраняем в поток s картинку SaveToStream(S).
     //закрываем цикл.
     s.Free;

Набдюдается картина-OutOfMemory! Во время работы цикла идет постоянный прирост загрузки памяти, по не Out.
Подскажите пожалуйста, как освобождать память от потока(или содержимого потока)?


 
Ketmar ©   (2006-10-05 02:40) [1]

ну а чего ты хотел? если ты постоянно пишешь в memory stream, натурально, этот стрим жрёт всё больше memory. %-)


 
alex_sz   (2006-10-05 02:46) [2]

А не подскажите как грамотнее это реализовать?


 
Джо ©   (2006-10-05 02:48) [3]

> [2] alex_sz   (05.10.06 02:46)
> А не подскажите как грамотнее это реализовать

Что реализовать-то?


 
alex_sz   (2006-10-05 02:51) [4]

Запись в поток без перегрузки памяти


 
Джо ©   (2006-10-05 03:04) [5]

> [4] alex_sz   (05.10.06 02:51)
> Запись в поток без перегрузки памяти

При чем здесь "перегрузка памяти"? Ты пишешь в память, разумеется, растет ее использование.


 
alex_sz   (2006-10-05 03:06) [6]

Но веть я потом ее стираю. Пробовал и free и destroy - все равно перегружается.


 
Германн ©   (2006-10-05 03:11) [7]


> alex_sz   (05.10.06 02:51) [4]
>
> Запись в поток без перегрузки памяти
>

И вот опять яркий пример неумения задать правильный вопрос. Р.Шэкли идёт на север! :-)
<Telepator on>
    //Задаем цикл.
    s:=memorystream.create;
    //В цикле сохраняем в поток s картинку SaveToStream(S).
    s.Free;
    //закрываем цикл.
<Telepator off>


 
alex_sz   (2006-10-05 03:16) [8]


>  //Задаем цикл.
>     s:=memorystream.create;
>     //В цикле сохраняем в поток s картинку SaveToStream(S).
>
>     s.Free;
>     //закрываем цикл.


Тоже самое - OutOfMemory


 
Германн ©   (2006-10-05 03:37) [9]


> alex_sz   (05.10.06 03:16) [8]
>
>
> >  //Задаем цикл.
> >     s:=memorystream.create;
> >     //В цикле сохраняем в поток s картинку SaveToStream(S).
>
> >
> >     s.Free;
> >     //закрываем цикл.
>
>
> Тоже самое - OutOfMemory
>

Ну тогда приведи наконец реальный код, который даёт ошибку!
Ну сколько же можно нам тут "телепатировать"?!


 
alex_sz   (2006-10-05 03:45) [10]

with table do begin
   first;
     while not eof do
       begin
           PictStream := TMemoryStream.Create;
           (table.FieldByName("RPHOTO") as TBlobField).SaveToStream(PictStream);
           PictStream.Free;
         next;
       end;
 end;


 
Palladin ©   (2006-10-05 06:29) [11]

это не весь реальный код


 
alex_sz   (2006-10-05 11:56) [12]


> Palladin ©   (05.10.06 06:29) [11]
>
> это не весь реальный код


Не хватает обьявления переменой PictStream и все. А этот код висит на кнопке в OnClick. Код конечно урезан, но то что в нем удалено ни как не влияет. В этом варианте тоже самое.


 
Palladin ©   (2006-10-05 12:02) [13]

ну значит у тебя в базе 2ух гигабайтная картинка


 
alex_sz   (2006-10-05 12:36) [14]

Да нет.Обычные bmp-ки 320*200. Причем запускаешь диспетчер задач во время выполнения цикла, очень хорошо видно что расход память на хронографе ровно идет вверх, увеличиваясь с каждой операцией. Ну неужто это такая невыполнимая задача???


 
Kolan ©   (2006-10-05 13:04) [15]


> next;

А это что?


 
Ketmar ©   (2006-10-05 16:42) [16]

>[15] Kolan(c) 5-Oct-2006, 13:04
>> next;
>А это что?
переход на следующую запись в таблице, полагаю.


 
ProgRAMmer Dimonych   (2006-10-05 17:21) [17]

А если FileStream"ом заменить?


 
alex_sz   (2006-10-05 19:53) [18]


> А если FileStream"ом заменить?


Если можно поподробнее.


 
alex_sz   (2006-10-05 20:08) [19]

Может хоть инфа какая есть?Ищу-не могу найти.Может не вижу.Хэлп дельфи ничего не говорит толкового.Причем схема примера такая же:create - free.


 
medved_68 ©   (2006-10-05 22:00) [20]

alex_sz А если так:

PictStream := TMemoryStream.Create;
with table do begin
  first;
    while not eof do
        begin
            (table.FieldByName("RPHOTO") as TBlobField).SaveToStream                (PictStream);
            PictStream.Clear;
        next;
      end;
  end;
PictStream.Free;



 
alex_sz   (2006-10-05 22:02) [21]

Тупик совсем какой-то


 
alex_sz   (2006-10-05 22:05) [22]


> medved_68 ©   (05.10.06 22:00) [20]
>
> alex_sz А если так:
>
> PictStream := TMemoryStream.Create;
> with table do begin
>   first;
>     while not eof do
>         begin
>             (table.FieldByName("RPHOTO") as TBlobField).
> SaveToStream                (PictStream);
>             PictStream.Clear;
>         next;
>       end;
>   end;
> PictStream.Free;

К сожалению до строки PictStream.Free памяти не хватает


 
ProgRAMmer Dimonych   (2006-10-05 22:08) [23]

> [18], [19]
Pict:=TFileStream.Create("C:\MyFile.xxx",<Flags>);
//Работаем как с обычным Stream
Pict.Free;

<Flags> - набор флагов (см. VCL справку, объект TFileStream, метод Create)...


 
alex_sz   (2006-10-05 22:21) [24]


> ProgRAMmer Dimonych   (05.10.06 22:08) [23]
>
> > [18], [19]
> Pict:=TFileStream.Create("C:\MyFile.xxx",<Flags>);
> //Работаем как с обычным Stream
> Pict.Free;
>
> <Flags> - набор флагов (см. VCL справку, объект TFileStream,
>  метод Create)...


Абсолютно тоже самое-OutOfMemory


 
ProgRAMmer Dimonych   (2006-10-05 22:39) [25]

Ого! Может, если исходник не секретный, я его гляну у себя?


 
alex_sz   (2006-10-06 03:28) [26]

procedure TForm1.Button1Click(Sender: TObject);
var
 Count,CurrentNo: integer;
begin
 RegDS1.DisableControls;
 RegDS1.Last;
 RegDS1.First;
 Count:=RegDS1.RecordCount;
 CurrentNo:=0;
 with RegDS1 do begin
   first;
     while not eof do
       begin
         Label1.Caption:=IntToStr(RegDS1.RecNo);
         Label1.Refresh;
         if RegDS1.FieldByName("RPHOTO").IsNull=false then
         begin
           Pict:=TFileStream.Create("C:\MyFile.dat",fmOpenReadWrite);            
           (RegDS1.FieldByName("RPHOTO") as TBlobField).SaveToStream(Pict);
           pict.Free;
         end;
         next;
         CurrentNo:=CurrentNo+1;
         ProgressBar1.Position:=100 * CurrentNo div Count;
       end;
 end;
 RegDS1.EnableControls;
end;

Компоненты для работы с базой FIBPlus.И больше ничего.


 
ASoft   (2006-10-06 05:01) [27]

>alex_sz[26]
и все же, что на самом деле должно происходить после сохранения в Pict картинки?
Что-то здесь не так, ничего не делая далее с Pict, ты его уничтожаешь...
Конечная цель этих манипуляций?


 
Percent   (2006-10-06 05:09) [28]

procedure TForm1.Button1Click(Sender: TObject);
var
 FS: TFileStream;
 BS: TStream;
 BM: TBookmark;
 Field: TField;
begin
 RegDS1.DisableControls;
 try
   BM := RegDS1.GetBookmark;
   try
     RegDS1.Last; // Ты уверен, что эта строка нужна?
     RegDS1.First;
     Field := RegDS1.FieldByName("RPHOTO");  
     ProgressBar1.Max := RegDS1.RecordCount;  
     while not RegDS1.Eof do
     begin
       ProgressBar1.Position := RegDS1.RecNo;
       Label1.Caption := IntToStr(RegDS1.RecNo) + " из " + IntToStr(RegDS1.RecordCount);
       Label1.Repaint;
       if not Field.IsNull then
       begin
         FS := TFileStream.Create("C:\" + IntToStr(RegDS.RecNo), fmOpenWrite);
         try
           BS := RegDS1.CreateBLOBStream(Field, bmRead);
           try
             FS.CopyFrom(BS, BS.Size);
           finally
             BS.Free;
           end;
         finally    
           FS.Free;
         end;
       end;
       RegDS1.Next;
     end;
     RegDS1.GotoBookmark(BM);
   finally
     RegDS1.FreeBookmark(BM);
   end;
 finally
   RegDS1.EnableControls;
 end;
end;


P.S. И не говори, что и здесь утечка памяти...


 
alex_sz   (2006-10-06 15:09) [29]


> ASoft   (06.10.06 05:01) [27]
>
> >alex_sz[26]
> и все же, что на самом деле должно происходить после сохранения
> в Pict картинки?
> Что-то здесь не так, ничего не делая далее с Pict, ты его
> уничтожаешь...
> Конечная цель этих манипуляций?


В теле картинка преобразуется из bmp в jpg. Указанный исходник только для прогона.


> Percent   (06.10.06 05:09) [28]
>
> P.S. И не говори, что и здесь утечка памяти...


Такая же утечка памяти.Кроме того, каждый раз создавать файл с именем номера записи - в базе их более 2000.


 
alex_sz   (2006-10-06 15:13) [30]

Грешным делом думаю, что с операционкой какой глюк


 
ProgRAMmer Dimonych   (2006-10-06 17:59) [31]

Антивирус что говорит?


 
alex_sz   (2006-10-06 20:21) [32]


> Антивирус что говорит?

Молчит собака.Спайварами всякими смотрел-чисто.Недавно ставил оптимизатор памяти.Может он чего напартачил


 
ProgRAMmer Dimonych   (2006-10-07 01:46) [33]

Так, оптимизатор удаляем... Смотрим...


 
Loginov Dmitry ©   (2006-10-07 09:09) [34]

Percent   (06.10.06 5:09) [28]
RegDS1.Last; // Ты уверен, что эта строка нужна?


А почему нет? Обычно ставлю строку в обработчик AfterOpen при открытии справочных таблиц, подставляемых в списки Lookup (это относится к базам данных InterBase). Если используются компоненты FibPlus, то возможно, что и в них тот же глюк, что и в IB Express (некорректно работает свойство RecordCount)


 
Percent   (2006-10-07 09:23) [35]

Loginov Dmitry ©   (07.10.06 09:09) [34]
...возможно, что и в них тот же глюк, что и в IB Express...


Поэтому и акцентировал внимание...


 
alex_sz   (2006-10-08 23:23) [36]

Дурдом какой-то. Пробовал на других машинах-таже ***ня!Память умирает.На втором своем компе с гигом озу количество операций не доходит до перегрузки.Тем не менее, загруз памяти остается до тех пор, пока не вырубишь прогу.ХЭЛП!!!


 
ProgRAMmer Dimonych ©   (2006-10-08 23:34) [37]

Может, скинь куда-нибудь исходники, мы глянем на месте, в оффлайне, спокойно.

А вообще как с отладчиком? Чё он говорит?


 
ProgRAMmer Dimonych ©   (2006-10-08 23:35) [38]

И откуда увереность в том, что жрёт ОЗУ именно этот кусок проги?


 
Vovan#1   (2006-10-08 23:41) [39]

Какая Делфя?


 
alex_sz   (2006-10-08 23:57) [40]

Экспереметировал, гонял просто pict.create - pict.free.Ничего в поток не записывал - все нормально.Ну вроде логично- поток пустой и прироста нет.
А исходник практически весь здесь -> [26], акромя процедуры fileopen.Его и гоняю.



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.039 c
4-1150359925
MAXLMN
2006-06-15 12:25
2006.10.29
Нотификационное сообщение - файл закрыт


2-1160651497
Kolan
2006-10-12 15:11
2006.10.29
Как прочетать весь файл использую TFileStream


2-1160447676
zlodey
2006-10-10 06:34
2006.10.29
Помогите разобраться


2-1160662054
novill
2006-10-12 18:07
2006.10.29
Почему TFileStream.size показывает 0 если файл отрывается


2-1161069769
_Mouse_
2006-10-17 11:22
2006.10.29
Проигрывание Wav, mp3 и тд.