Я испытываю проблему в своем приложении с 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();
Что-то может здесь препятствовать предыдущему объекту алгоритма анализа текста быть собранным "мусор"?