Форум: "Начинающим";
Текущий архив: 2013.11.03;
Скачать: [xml.tar.bz2];
ВнизПамять естся, подскажите как исправить для такого вызова: Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c