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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка дескрипторов 
:(
    Опции темы
N1ko
Дата 27.5.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

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



А можно ли как то более точно отследить на каком этапе у меня создаются дескрипторы, нежели запускать програму и смотреть на диспетчер? 
PM MAIL ICQ   Вверх
mihryak
Дата 27.5.2010, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM MAIL ICQ   Вверх
N1ko
Дата 28.5.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

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



Вот за это Вам огромное спасибо. Действительно помогло. Утечка идёт от String как я и предполагал. Насколько я понимаю string - ом должен занимаеться сборщик мусора автоматически. Но судя по всему он этого делать не успевает. Можно ли как то вучную это делать? String.Empty не помагает поскольку судя по всему из памяти строка не удаляется.

Это сообщение отредактировал(а) N1ko - 28.5.2010, 11:08
PM MAIL ICQ   Вверх
uranpro
Дата 28.5.2010, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

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



вот бы код рекурсии увидеть)...

Добавлено через 2 минуты и 28 секунд
Конец жизни переменной:
 - до конца области видимости в Debug
 - до последнего упоминания ее в коде в Release
http://forum.vingrad.ru/forum/topic-301328.html ©


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
N1ko
Дата 31.5.2010, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

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



uranpro ,вот собственно рекурсия. Метод ScanDbfFiles сканирует заданую папку на наличие в ней ДБФ файлов. Если таковые там есть, откурывается ДБФ соединение и с читывается вся инфа с файлов. Второй метод ScanFolder сканирует папку на наличие в ней других папок.

 
Код

private void ScanDbfFiles(string PrmPath)
        {
            dbfDir = new DBFolder(PrmPath); \\ класс DBFolder  - обёртка для папки, в котором хранятся ДБФ файлы
            DirectoryInfo _selectedDir = new DirectoryInfo(PrmPath);
            fiDirectoryFile = _selectedDir.GetFiles("*.dbf");
            if (fiDirectoryFile.Length != 0)
            {
                dbfDir.OpenConnection();
                sqLiteDB.OpenConnection(); \\ sqLiteDB - обёртка для реализации СУБД
                sqLiteDB.StartInsertProcess();
                foreach (FileInfo _file in fiDirectoryFile)
                {
                    using (DBFile _currDbf = new DBFile(_file, dbfDir.DBFConnection, sqLiteDB.Tables)) \\ DBFile - класс хранящий мнфу о ДБФ файле
                    {
                        if (_currDbf.Type != DBFTypes.Unknown)
                        {
                            if (!sqLiteDB.Tables[_currDbf.Type.GetHashCode()].InsertProvider.InsertFromDbf(_currDbf))
                            {
                                frmLBLog.Invoke(new DelAddItemToLog(AddItemToLog), _currDbf);
                            }
                        }
                        DBFCounter.SubFromSize(_file.Length); - DBFCounter - статический класс, который хранит инфу об общем объёме ДБФ файлов и о объёме уже просканированых фалов
                        this.frmBGVReport.ReportProgress(DBFCounter.Progress);
                    }
                }
                sqLiteDB.CommitInsertProcess();
                sqLiteDB.CloseConnection();
                dbfDir.CloseConnection();
            }
        }
        public void ScanFolder(string Path)
        {
            DirectoryInfo _currentFolder = new DirectoryInfo(Path);
            ScanDbfFiles(Path);
            DirectoryInfo[] SubSelectedDir = _currentFolder.GetDirectories();
            for (int i = 0; i < SubSelectedDir.Length; ++i)
            {
                ScanFolder(SubSelectedDir[i].FullName);
            }
        }



Вот такая вот реализация рекурсии...

Это сообщение отредактировал(а) N1ko - 31.5.2010, 10:53
PM MAIL ICQ   Вверх
mrbrooks
Дата 31.5.2010, 11:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



N1ko, 
используйте перегруженный метод DirectoryInfo.GetFiles(String, SearchOption), где SearchOption есть перечисление, характеризующее, искать ли файл в текущем каталоге, или еще и во вложенных.
Типа этого:
Код

//...
fiDirectoryFile = _selectedDir.GetFiles("*.dbf", SearchOption.AllDirectories);
//...


и никакой рекурсии.
PM MAIL   Вверх
N1ko
Дата 31.5.2010, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

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



Если так делать, возникают дополнительные сложности. Ну допустим просканим мы таким способом заданную папку, соответственно ссылки на все файлы будут находиться в одном хранилище и их будет очень много. Для того что бы прочитать ДБФ файл нужно открыть соединение с папкой, в которой он находится. А допустим таких фалов 20 и они распологаются не подряд. Тогда нам прийдётся создавать и открывать несколько раз одно и то же самое соединение. При преходе к каждому новому файлу прийдётся сверять его месторасположение по сравнению с предыдущим и тп. Считаю что проще будет всё таки рекурсией всё сделать. И в основе перегруженного метода с двумя параметраме наверняка используюется всё та же рекурсия. Хотя в этом и не особо уверен.

Это сообщение отредактировал(а) N1ko - 31.5.2010, 11:37
PM MAIL ICQ   Вверх
PashaPash
Дата 1.6.2010, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



N1ko, так сгруппируй результаты поиска по Path.GetDirectory
Код

            string[] files = Directory.GetFiles("<path>", "*.dbf", SearchOption.AllDirectories);
            var filesByDirectory = files.GroupBy(f => Path.GetDirectoryName(f)).ToList();

            foreach (var directory in filesByDirectory)
            {
                Console.WriteLine(directory.Key);
                // открыть соединение с directory.Key, пройтись по файлам-таблицам - foreach (string file in directory)
            }



--------------------
PM MAIL WWW   Вверх
PashaPash
Дата 1.6.2010, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



N1ko, кстати, а где в первом примере ты открываешь и закрываешь соединение? 


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

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



Во втором примере как раз видно что открываю я соединенеие перед использованием функции InsertFromDbf
 
Код

dbfDir.OpenConnection();
 sqLiteDB.OpenConnection(); \\ sqLiteDB - обёртка для реализации СУБД

 и сооответственно закрываю его после её завершения.
Код

sqLiteDB.CloseConnection();
dbfDir.CloseConnection();

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

Это сообщение отредактировал(а) N1ko - 1.6.2010, 12:42
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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