Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Освобождение памяти при чтении файла из БД 
:(
    Опции темы
voladu
Дата 7.5.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.5.2009

Репутация: нет
Всего: нет



Здравствуйте!

Занимаюсь чтением файлов из поля BLOB базы на SQL server.
Делал по примеру. Все вроде хорошо, но несмотря на вызов методов Close и Dispose для объектов FileStream и  BinaryWriter память не освобождается.
Это выражается в том, что в процессе чтения файла из базы в  диспетчере задач видно увеличение объема занятой памяти и увеличение процесса программы ("MyProg.vshos"). После принудительного запуска GarbageCollector память в процессе освобождается, но общая занятая память не освобождается.
Каким образом это можно решить?

Вот используемый код:
Код

using (FileStream fsFile = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
            {              
                BinaryWriter bwFile = new BinaryWriter(fsFile);     
                byte[] abBytes = new byte[] { 0 };   // партия данных
                int FileOffset = 0;                    
                int LengthFile = 0;
                int CurrentBufSize = 0;

                    byte[] PtrFile;
                    // получение указателя на файл
                    PtrFile = this.GetDocFilePointer(DocID);
                    // определение длины файла
                    LengthFile = this.GetDocFileLength(DocID);
                    // Стартовое смещение файла for the new BLOB.
                    FileOffset = 0;
                    do
                    {
                        if ((FileOffset + this.BufferLen) >= LengthFile)
                            CurrentBufSize = LengthFile - FileOffset;
                        else CurrentBufSize = this.BufferLen;
                        abBytes = this.ReadDocFile(PtrFile, FileOffset, CurrentBufSize); // чтение очередной порции из БД
                        bwFile.Write(abBytes);
                        bwFile.Flush();
                        fsFile.Flush();
                        FileOffset += CurrentBufSize;
                    } while (FileOffset < LengthFile);

                    bwFile.Close();
                    fsFile.Close();
                    fsFile.Dispose();
            }


Дополнительно вызываю такое, но безуспешно:
Код

 public void ReduceMemory()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
        }

PM MAIL   Вверх
guro
Дата 7.5.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 24.4.2009

Репутация: нет
Всего: нет



А Dispose для abBytes можно сделать?
PM MAIL   Вверх
-Mikle-
Дата 7.5.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 1
Всего: 59



Цитата(voladu @  7.5.2009,  20:16 Найти цитируемый пост)
Это выражается в том, что в процессе чтения файла из базы в  диспетчере задач видно увеличение объема занятой памяти и увеличение процесса программы ("MyProg.vshos"). После принудительного запуска GarbageCollector память в процессе освобождается, но общая занятая память не освобождается


Память освободится если она потребуется системе. До тех пор, пока она ей не нужна, она не будет делать никаких движений по реаллокации данных. Dispose сделал и будь спокоен.

PS: using сам делает Dispose своей переменной, для этого и существует вся эта конструкция.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
voladu
Дата 13.5.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.5.2009

Репутация: нет
Всего: нет



Цитата(guro @ 7.5.2009,  17:39)
А Dispose для abBytes можно сделать?

Нет у него такого метода.
Цитата(-Mikle-)

Память освободится если она потребуется системе. До тех пор, пока она ей не нужна, она не будет делать никаких движений по реаллокации данных. Dispose сделал и будь спокоен.

После некоторого тестирования оказалось что так оно и происходит. Спасибо!
Конечно несколько настораживает, что оно съедает всю память, которая есть. А для работы понемножку освобождает, но совсем немного. Полный сбос происходит после закрытия программы.
PM MAIL   Вверх
PashaPash
Дата 13.5.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 8
Всего: 49



voladu, вообще-то у тебя очень сомнительно сделано чтение. что делает GetDocFilePointer? PtrFile, судя по типу byte[] это никакой не "указатель", а просто массив в памяти, в который GetDocFilePointer вычитывает сразу все данные из базы. И потом ты вместо bwFile.Write(PtrFile) перегоняешь данные еще через один массив. Память во время операции при этом отъедается под весь документ.
Cтандартный метод "получить указатель на файл в базе" - это ExecuteReader с CommandBehavior.SequentialAccess, с последующим чтением кусков через DataReader.GetBytes(). Покопай MSDN на эту тему.

Это сообщение отредактировал(а) PashaPash - 13.5.2009, 17:40


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1175 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.