私はネストされたforループで自分のアプリケーションにメモリの問題があり、改善方法を見つけることができません。私はlinqを使ってみましたが、メモリリークがまだあるので、内部的には同じです。ネストされたループを最適化する
EDIT:私が要求されたように、私は私の問題についての詳細を提供します。
私はすべての顧客(約400.000)をLuceneのドキュメントストアに登録しています。各顧客は複数の代理店に存在することができ、そのうちのいくつかは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);
}
}
EDIT:ソリューション
問題は、私は内側のループで「文書」オブジェクトのインスタンスを再利用していなかったし、その
は私のプロセスは、このようになります私のサービスのメモリ使用量が激しくなってしまった。ドキュメントの1つのインスタンスを再利用するだけで、私の問題は解決しました。
ありがとうございました。
は、それ自体で、このコードは、漏洩ではありません。 –
「メモリを大量に使用する」と「メモリリークを行う」の違いがあります。 – David
あなたはそれをあまりにも単純化しました。 –