ネストされた for ループを使用するアプリケーションでメモリの問題が発生しており、それを改善する方法がわかりません。私はlinqを使ってみましたが、メモリリークがまだ残っているので、内部的には同じだと思います。
編集:私が要求されたように、私は私の問題についてより多くの情報を提供します.
すべての顧客 (約 400.000) を Lucene ドキュメント ストアにインデックス化しました。各顧客は、200 ~ 300 の代理店にいるよりも、複数の代理店に存在し、そのうちのいくつかを終了することができます。
「グローバル」顧客インデックスからすべての顧客を取得し、代理店ごとに個別のインデックスを作成して、表示できる顧客のみを含める必要があります。各エージェンシー インデックスに適用する必要があるビジネス ルールとセキュリティ ルールがいくつかあるため、現在、すべてのエージェンシーに対して 1 つの顧客インデックスを維持する余裕はありません。
私のプロセスは次のようになります。
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 の単一のインスタンスを再利用するだけで、私の問題は解決しました。
みんな、ありがとう。