중첩 for 루프로 내 응용 프로그램에 메모리 문제가있어 개선 방법을 찾을 수 없습니다. 나는 linq를 사용하여 시도했지만 내부적으로 메모리 누수가 있기 때문에 동일하다고 생각한다.중첩 루프 최적화
편집 : 내가 요청한대로, 나는 나의 문제에 관하여 더 많은 정보를 제공 할 것이다.
Lucene 문서 저장소에 색인 된 모든 고객 (약 400.000)이 있습니다. 각 고객은 2 개 이상의 대행사에 출석 할 수 있으며 그 중 일부는 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의 단일 인스턴스를 재사용하면 문제가 해결됩니다.
모두에게 감사드립니다.
은, 그 자체로이 코드를 누설하지 않습니다. –
"많은 메모리 사용"과 "메모리 누수"사이에는 차이가 있습니다. – David
너무 단순화했습니다. –