Вопрос о Сборке "мусора" C#.NET

Я испытываю проблему в своем приложении с OutOfMemoryException. Мое приложение может искать слова в рамках текстов. Когда я запущу длительный поиск процесса для поиска приблизительно 2 000 различных текстов приблизительно 2 175 различных слов, приложение завершится приблизительно в 50% через с OutOfMemoryException (приблизительно после 6 часов обработки)

Я пытался найти утечку памяти. У меня есть граф объектов как: (-> ссылки),

статический глобальный объект приложения (контроллер)-> объект начинающего алгоритма-> объект начинающего анализа текста-> объект алгоритма анализа текста (этот объект выполняет поиск).

Объект начинающего анализа текста запустит выполнение объекта алгоритма анализа текста () - метод в отдельном потоке.

Чтобы попытаться устранить проблему, я отредактировал код так, чтобы объект начинающего анализа текста разделил тексты, чтобы искать в несколько групп и инициализировать один объект алгоритма анализа текста для каждой группы текстов последовательно (поэтому, когда один объект алгоритма анализа текста будет закончен, новое будет создано для поиска следующей группы текстов). Здесь я установил предыдущий объект алгоритма анализа текста в NULL. Но это не решает проблему.

Когда я создаю новый объект алгоритма анализа текста, я должен дать ему некоторые параметры. Они взяты от свойств предыдущего объекта алгоритма анализа текста, прежде чем я установил тот объект в NULL. Это предотвратит сборку "мусора" объекта алгоритма анализа текста?

Вот код для создания новых объектов алгоритма анализа текста начинающим алгоритма анализа текста:

    private void RunSeveralAlgorithmObjects()
    {

        IEnumerable<ILexiconEntry> currentEntries = allLexiconEntries.GetGroup(intCurrentAlgorithmObject, intNumberOfAlgorithmObjectsToUse);

        algorithm.LexiconEntries = currentEntries;
        algorithm.Run();

        intCurrentAlgorithmObject++;

        for (int i = 0; i < intNumberOfAlgorithmObjectsToUse - 1; i++)
        {
            algorithm = CreateNewAlgorithmObject();
            AddAlgorithmListeners();
            algorithm.Run();
            intCurrentAlgorithmObject++;
        }

    }

    private TextMiningAlgorithm CreateNewAlgorithmObject()
    {
        TextMiningAlgorithm newAlg = new TextMiningAlgorithm();

        newAlg.SortedTermStruct = algorithm.SortedTermStruct;
        newAlg.PreprocessedSynonyms = algorithm.PreprocessedSynonyms;
        newAlg.DistanceMeasure = algorithm.DistanceMeasure;
        newAlg.HitComparerMethod = algorithm.HitComparerMethod;
        newAlg.LexiconEntries = allLexiconEntries.GetGroup(intCurrentAlgorithmObject, intNumberOfAlgorithmObjectsToUse);
        newAlg.MaxTermPercentageDeviation = algorithm.MaxTermPercentageDeviation;
        newAlg.MaxWordPercentageDeviation = algorithm.MaxWordPercentageDeviation;
        newAlg.MinWordsPercentageHit = algorithm.MinWordsPercentageHit;
        newAlg.NumberOfThreads = algorithm.NumberOfThreads;
        newAlg.PermutationType = algorithm.PermutationType;
        newAlg.RemoveStopWords = algorithm.RemoveStopWords;
        newAlg.RestrictPartialTextMatches = algorithm.RestrictPartialTextMatches;
        newAlg.Soundex = algorithm.Soundex;
        newAlg.Stemming = algorithm.Stemming;
        newAlg.StopWords = algorithm.StopWords;
        newAlg.Synonyms = algorithm.Synonyms;
        newAlg.Terms = algorithm.Terms;
        newAlg.UseSynonyms = algorithm.UseSynonyms;

        algorithm = null;

        return newAlg;
    }

Вот запуск потока, который выполняет целый поисковый процесс:

            // Run the algorithm in it's own thread
            Thread algorithmThread = new Thread(new ThreadStart
                (RunSeveralAlgorithmObjects));
            algorithmThread.Start();

Что-то может здесь препятствовать предыдущему объекту алгоритма анализа текста быть собранным "мусор"?

5
задан gurkan 7 August 2010 в 08:35
поделиться