У меня проблема с приложением OutOfMemoryException. Мое приложение может искать слова в текстах. Когда я запускаю длительный поиск процессов для поиска около 2000 различных текстов и поиска около 2175 различных слов, приложение завершает свою работу примерно на 50% через OutOfMemoryException (после 6 часов обработки)
Я пытался найти утечку памяти. У меня есть граф объектов, как: (-> ссылки)
статический глобальный объект приложения (контроллер) -> начальный объект алгоритма -> начальный объект интеллектуального анализа текста -> объект алгоритма интеллектуального анализа текста (этот объект выполняет поиск).
Начальный объект интеллектуального анализа текста запустит метод run () - объекта алгоритма интеллектуального анализа текста в отдельном потоке.
Чтобы попытаться решить эту проблему, я отредактировал код так, чтобы начальный объект интеллектуального анализа текста разбивал тексты для поиска по нескольким группам и последовательно инициализировал один объект алгоритма интеллектуального анализа текста для каждой группы текстов (например, при использовании одного алгоритма интеллектуального анализа текста). объект завершен, будет создан новый для поиска следующей группы текстов). Здесь я установил предыдущий объект алгоритма интеллектуального анализа текста на ноль. Но это не решает проблему.
Когда я создаю новый объект алгоритма интеллектуального анализа текста, я должен задать ему некоторые параметры. Они взяты из свойств предыдущего объекта алгоритма интеллектуального анализа текста до того, как я установил для этого объекта значение 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();
Может ли что-то здесь помешать сборке мусора из предыдущего объекта алгоритма анализа текста?