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

Вниз

Память естся, подскажите как исправить для такого вызова:   Найти похожие ветки 

 
vrem   (2013-01-11 10:58) [0]

Не то что жалко, просто на работе памяти меньше и ошибка выскакивает.
я знаю, что частое setlength() как причина, это убрал, запускается раз 5-6,
move(туда сюда) - наверное не может есть память,
getmem-freemem частое на одной переменной - не знаю.

остаётся такое -

function dino(s:Tfilestream; sme,siz:int64; kuku:pchar; arba:(тип array of integer); var kus:integer):int64;

вызывается:

Stream:=TFileStream.Create(df,fmOpenRead or fmShareDenyNone);
try
...
if dino(Stream,0,sizeof(sembr),dichik, vhdbat,kuskus)<>sizeof(sembr) then begin showmessage("1-е чтение не получилось"); exit; end;
...
finally
..
  Stream.Free;
end;

Stream - уже открытый поток, его дескриптор передаётся в эту функцию, а она читает в буфер. может быть нельзя так передавать поток в функцию?, но удобно,  несколько вызовов, а сама функция не просто читает, а с учётом переменных передаваемых. размеры для чтения маленькие, не более 300 мегабайт, обычно от 0,1 до 20-30 мегабайт за раз.

если в этом причина излишнего расхода памяти - как можно изменить?
если памяти много, то программа отрабатывает без ошибок, отъедает гигабайта 2 только :)


 
Ega23 ©   (2013-01-11 11:41) [1]


> Stream - уже открытый поток, его дескриптор передаётся в
> эту функцию


А ты его в этой функции ещё раз создаёшь. :)


 
vrem   (2013-01-11 12:00) [2]

там просто чтение, stream.readbufer

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


 
MBo ©   (2013-01-11 13:13) [3]

Это не вопрос, а обрывки потока сознания


 
vrem   (2013-01-11 13:34) [4]

Удалено модератором


 
MBo ©   (2013-01-11 13:53) [5]

Попробуй всё же сформулировать вопрос так, чтобы его можно было понять, да и подробности кода не помешают


 
vrem   (2013-01-11 13:57) [6]

MBo
а можно ответить по тому, что я уже указал? то есть дескриптор потока передаётся в функцию, по нему считывается в буфер из файла - я даже код привёл этого. вопрос - так можно делать в принципе или нельзя. я понимаю, что не понять можно что угодно, но когда уже код есть, по нему ответить же можно? если нет, то ладно, может быть зайдёт кто то, кто ответит.


 
sniknik ©   (2013-01-11 14:06) [7]

> вопрос - так можно делать в принципе или нельзя.
можно. почему нет? параметры на то и есть чтобы через передавать...

а что тут хреново это
> showmessage("1-е чтение не получилось");
слабая, ничего не поясняющая, с точки зрения поддержки, замена нормальному эксепту (который ты наверняка в своей функции блокируешь чтобы результат вернуть...).


 
sniknik ©   (2013-01-11 14:08) [8]

> но когда уже код есть
кода нет... "жалоба" на утечку, единственное где она возможна это внутри твоей функции. и ее содержимого, того что нужно для ответа нет. т.что - кода нет.


 
MBo ©   (2013-01-11 14:09) [9]

Переменную потока так передавать в функцию можно, на потребление памяти это не влияет
Больше настораживает arba:(тип array of integer); но без реального кода неясно, в этом ли дело.


 
vrem   (2013-01-11 14:21) [10]

эта функция читает из файла vhd динамического диска, то есть используется бат-таблица для вычисления реальных смещений, она и передаётся как параметр в функцию, то есть таблица определена заранее и с ней нет проблем.
я думал тут принципиальная ошибка какая то с потоком, раз нет поищу сам, спасибо.


 
Anatoly Podgoretsky ©   (2013-01-11 14:51) [11]

что такое бат-таблица?


 
Sha ©   (2013-01-11 16:13) [12]

> vrem

попробуй сделать минимальную демку


 
vrem   (2013-01-12 10:16) [13]

нашёл в чём дело было. это
DCPcrypt v2.0 written by David Barton - после считывания с диска буфера его хеш подсчитывается, делаю всё по примеру, но вот память естся. закоментировал вызовы - кончилась проблема. напишу наверное товарищу :)


 
vrem   (2013-01-12 10:33) [14]

оказывается за 8 лет он успел выпустить обновление, теперь памяти естся в половину меньше.. что тоже полезно, всем спасибо.


 
vrem   (2013-02-08 11:56) [15]

я нашёл причину утечки памяти и это не я :) и даже не DCPcrypt v2.0

а причина в untNtCompress.pas - этоn модуль позволяет разжимать файлы, сжатые ntfs-системой, то есть если вручную считать с диска такой сжатый файл, то этот модуль его разожмёт, используя windows dll = ntdll.dll

в таком сжатом файле сжат не весь файл сразу, а сжат каждый 65536 байтный кусок(16 кластеров по 4096), это микрософт так придумала.
то есть вот эта функция вызывается много-много раз - кусок сжатого файла считывается в память и затем в эту функцию. подскажите как её изменить, что ли, а то память жрёт вообще - при обработке 10 гигабайтного диска занимаемая программой память = 2500 мегабайт, отключаю вызов этой функции, занимаемая память 100 мегабайт.

function DecompressMemory(lpMemory: Pointer; var Size: Cardinal; dwCompression: DWORD = COMPRESSION_FORMAT_LZNT1): Pointer;
var
 lpOutput: Pointer;
 dwTemp, dwOutputSize: DWORD;
begin
 Result := nil;
 dwOutputSize := Round(Size * 12.5);
 lpOutput := VirtualAlloc(nil, dwOutputSize, MEM_COMMIT, PAGE_READWRITE);
 if lpOutput <> nil then
 begin
   begin
     dwTemp := 0;
     RtlDecompressBuffer(dwCompression, lpOutput, dwOutputSize, lpMemory, Size, @dwTemp);
     if dwTemp <> 0 then
     begin
       Size := dwTemp;
       Result := lpOutput;
     end;
   end;
 end;
end;

весь этот модуль = http://read.pudn.com/downloads167/sourcecode/zip/768029/Compress%20and%20Decompress/untNtCompress.pas__.htm

может быть как то заранее буфер в памяти организовывать?


 
RWolf ©   (2013-02-08 12:01) [16]

а что это в нём VirtualAlloc кругом вызывается без парных VirtualFree?


 
vrem   (2013-02-08 12:02) [17]

вот как бы это исправить, я даже слов таких не знаю, подскажите, пожалуйста.


 
Плохиш ©   (2013-02-08 12:27) [18]

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366803(v=vs.85).aspx

В своём коде, после обработки результата этой функции, надо вызвать VirtualFree.


 
vrem   (2013-02-08 12:34) [19]

вызвал :)
//надо еа освободить
if not VirtualFree(ea,0,MEM_RELEASE) then showmessage("не освободилось");
теперь после обработки того же 10 гигабайтного диска 129 мегов всего естся.
спасибо!



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

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

Наверх




Память: 0.51 MB
Время: 0.007 c
15-1368891373
Разведка
2013-05-18 19:36
2013.11.03
Помогите устроится программистом


15-1368728640
Cynic
2013-05-16 22:24
2013.11.03
Разработчик интерфейсов


15-1368704471
sniknik
2013-05-16 15:41
2013.11.03
Клиент не работает под wine (убунта) ...


3-1293438440
avers_sm
2010-12-27 11:27
2013.11.03
Как передать TIBTransaction в качестве параметра процедуры.


2-1360298852
Andrey K
2013-02-08 08:47
2013.11.03
Вкладка Diagram