14

現在、テンプレート化された電子メール(数千)を送信するバックグラウンドプロセスの一部としてRazorEnginev2.1を使用しています。処理を高速化するために、テンプレートはmd5の合計を名前としてコンパイルされます。これにより、テンプレートが変更されたときに再コンパイルされ、テンプレートを使用するすべての電子メールで同じコンパイル済みテンプレートを使用できるようになります。コンパイルされたテンプレートの名前をリストに記録して、いつコンパイルを再度呼び出すかを知ることができます(そして他のいくつかのことを行います)。

問題:非常に長い時間と多くのテンプレート変更の後、これらのキャッシュされたコンパイル済みテンプレートはすべて、に格納されているように見えるため、おそらくまだメモリに残っていることに気付きましたdynamic。この特定のプロセスでは、再起動せずに一度に数か月実行される可能性がありますが、以前のバージョンのテンプレートがすべてまだ残っている場合、これは重大なメモリリークを構成する可能性があります。

質問:古いテンプレートのキャッシュを解除して、テンプレートがぶらぶらしないようにする方法はありdynamicますか?

たとえば、コンパイルされたテンプレートオブジェクトを自分で保持し、それらを使用したいときにRazorEngineに渡すことができた場合、それらをいつ破棄するかを決定でき、メモリリークがなくなります。ただし、RazorEngineがすでにこれを回避する方法を持っている場合は、インターネット上でこの特定の問題への参照をあまり見つけることができないため、それについて知ることも便利です。コンパイルされたテンプレートを使用してメモリ使用量を削減する必要がある理由についてはたくさんありますが、長寿命のアプリケーションに蓄積された大量の未使用のコンパイル済みテンプレートについて何かを見つけるのに苦労しました。

編集:キャッシングがどのように機能するか、そして同じ名前が別のテンプレートで渡された場合、それを再キャッシュして古いものを破棄することについて少し読んだところです。ただし、時間の経過とともに電子メールが追加および削除され、時間の経過とともにすべての古い削除された電子メールが引き続き存在するため(テンプレートの各バージョンのコピーは保存されませんが)、ここでの問題は依然として残ります。

4

3 に答える 3

7

一部の人々にとってはまだ関連性があるように思われるため、これに答えます。( https://github.com/Antaris/RazorEngine/issues/232#issuecomment-128802285 )

再起動せずに一度に数か月実行される可能性があるこの特定のプロセスでは、以前のバージョンのテンプレートがすべて残っていると、重大なメモリ リークが発生する可能性があります。

テンプレートを変更して再コンパイルすると、読み込まれたアセンブリ (RazorEngine がバックグラウンドでコンパイルして読み込む) をアンロードできないため、メモリ リークが発生します。

メモリを実際に解放する唯一の方法は、AppDomain をリロードするか、プロセスを再起動することです。

他の回答は、デフォルト構成でのメモリリークを防ぎ(問題を認識させるため)、別のテンプレートコードでキーを再コンパイルできるようにするためのカスタム構成が必要な新しいバージョンについて話しているようです。他のすべての回答は、実際にはメモリ消費量を増加させることに注意してください!

matthid、RazorEngine 寄稿者

于 2015-08-07T19:36:34.680 に答える
2

RazorEngine は、コンパイルされたテンプレートのキャッシュを TemplateService インスタンス内に格納しているようです。したがって、TemplateService の新しいインスタンスを随時再作成して、キャッシュされたすべてのテンプレートを削除できます。

RazorEngine に基づいており、有効期限付きのカスタム キャッシュ メカニズムを実装する独自のライブラリの使用を検討することもできます: http://www.nuget.org/packages/Essential.Templating.Razor

于 2014-03-12T09:14:46.133 に答える