Сборка мусора на сервере и линейное увеличение времени параллельных задач - PullRequest
0 голосов
/ 14 марта 2011

Народ - у меня есть задача А, которую я выполняю последовательно ~ 100 раз.Каждая задача A имеет много задач B, которые обрабатываются параллельно.B хранит данные, которые необходимы после завершения всех A.Таким образом, объем памяти программы увеличивается со временем.Это «долгосрочные» задачи.

Я обнаружил, что A тратит много времени на выполнение каждого последующего A. Я реализовал сборку мусора на сервере, и произошло значительное улучшение - время выполнения A было сокращено вдвое!Тем не менее, время А заканчивало расти с каждым последующим А - линейно.Таким образом, к 10-му А улучшения в Сборке мусора на сервере не имели значения - полные 100 А никогда не завершатся в разумные сроки, и мне нужно будет остановить процесс.

Моя гипотеза состоит в том, что растущий объем памятизаставляя GC выполнять больше работы с течением времени, замедляя все.

  1. Есть ли у вас какие-либо другие гипотезы, которые я могу проверить?
  2. Если моя гипотеза заслуживает изучения, какие решения я могу найти?Должен ли я стать более практичным с сборщиком мусора?Может быть, я должен сбросить данные в памяти на диск и высосать их, когда мне это нужно?

EDIT
Я забыл упомянуть, что каждый B вызывает GC.Collect иGC.WaitForPendingFinalizers, потому что я автоматизирую COM, и это единственный способ обеспечить запуск процесса COM-сервера.

Ответы [ 2 ]

0 голосов
/ 16 марта 2011

Если вам действительно лень аккуратно распоряжаться своими COM-объектами, я бы использовал один AppDomain для COM-взаимодействия, а другой - для накопления данных.

0 голосов
/ 15 марта 2011

Нашел проблему! Когда каждый А завершается, я теперь сериализую данные на диск. Таким образом, объем памяти остается постоянным по А. Используя эту технику, больше нет линейного роста во времени, необходимого для завершения A. Его константа. После того, как все сделано, я просто десериализирую данные на диске. Хотя это немного отнимает много времени, потому что теперь есть много данных, которые нужно прочитать, это не должно сравниваться с количеством времени, сэкономленного при поддержании постоянного в.

...