Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1359817506
TSas
2013-02-02 19:05
2013.11.03
Не могу получить свойство Name элемента вебстраницы


4-1268135204
somio
2010-03-09 14:46
2013.11.03
Как узнать права текущего пользователя Windows


2-1360085593
Novice
2013-02-05 21:33
2013.11.03
Выделение строки ListView другим цветом


15-1368879134
wl
2013-05-18 16:12
2013.11.03
плата за ПО


2-1360311329
Camaro
2013-02-08 12:15
2013.11.03
снизить цену на определенный %





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский