我的应用程序有一个嵌套 for 循环的内存问题,我不知道如何改进它。我尝试过使用 linq,但我想在内部它是相同的,因为内存泄漏仍然存在。
编辑:正如我被要求的那样,我将提供有关我的问题的更多信息。
我已经在 Lucene 文档存储中索引了我的所有客户(大约 400.000)。每个客户可以出现在多个代理机构中,其中一些客户可以在 200-300 家代理机构中退出。
我需要从“全球”客户索引中检索我的所有客户,并为每个代理商建立一个单独的索引,只包含它可以看到的客户。有一些业务规则和安全规则需要应用到每个代理索引,所以现在,我无法为我的所有代理维护一个客户索引。
我的过程如下所示:
int numDocuments = 400000;
// Get a Lucene Index Searcher from an Index Factory
IndexSearcher searcher = SearcherFactory.Instance.GetSearcher(Enums.CUSTOMER);
// Builds a query that gets everything in the index
Query query = QueryHelper.GetEverythingQuery();
Filter filter = new CachingWrapperFilter(new QueryWrapperFilter(query));
// Sorts by Agency Id
SortField sortField = new SortField("AgencyId, SortField.LONG);
Sort sort = new Sort(sortField);
TopDocs documents = searcher.Search(query, filter, numDocuments, sort);
for (int i = 0; i < numDocuments; i++)
{
Document document = searcher.Doc(documents.scoreDocs[i].doc);
// Builds a customer object from the lucene document
Customer customer = new Customer(document);
// If this nested loop is removed, the memory doesn't grow
foreach(Agency agency in customer.Agencies)
{
// Gets a writer from a factory for the agency id.
IndexWriter writer = WriterFactory.Instance.GetWriter(agency.Id);
// Builds an agency-specific document from the customer
Document customerDocument = customer.GetAgencyDocument(agency.Id);
// Adds the document to the agency's lucene index
writer.AddDocument(customerDocument);
}
}
编辑:解决方案
问题是我没有在内部循环中重用“文档”对象的实例,这导致我的服务的内存使用量不雅增长。只需在整个过程中重用 Document 的单个实例就可以解决我的问题。
谢谢大家。