問題タブ [large-object-heap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - バイナリ読み取り時の LOH の回避
この質問は、多数のバイナリ ファイルを SQL Server データベースに転送する効率的な方法のフォローアップ です。
最初に、なぜ usingFile.ReadAllBytes
が急速なメモリ使用を引き起こしているのかを尋ねたところ、そのメソッドを使用すると、実行時に簡単に回収できない大きなオブジェクト ヒープにデータが配置されるという結論に達しました。
私の質問は今、その状況を回避する方法ですか?
次のコードは、ファイルを一度にではなくチャンクで読み取ることによって問題を回避することを目的としていますが、同じ問題があるようです。
c# - バイナリデータを段階的に保存する Nibernate
バイナリの読み取り時に LOH を回避する からのフォローアップ
Stream
Nhibernate では、データベースにチャンクで保存することは可能でしょうか?
次のコードでは、FileStream が開かれ、その内容が 2kb のチャンクで読み取られます。
通常、オブジェクトは 1 回の操作で永続化されますが、段階的に行うことはできますか?
entity-framework - IIS 6 アプリケーション プールが、CLR によって消費されるメモリの 10 倍を占めるのはなぜですか
IIS 6.0 アプリケーション プールは、ページの最初の読み込みで 155Mb のメモリを消費します。その後同じページを更新すると、消費されるアプリ プール メモリは最大で約 245Mb になります。
これは Web フォーム アプリケーションであり、Entity Framework と DevExpress コントロールを使用します。
最初はこれはメモリ リークだと思っていましたが、メモリ プロファイラを使用してさらに調査したところ、アプリ プールによって占有されている領域の半分以上が空き領域であり、断片化されていることがわかりました。
これにより、Large Object Heap メモリの断片化が原因であることがわかりました。実際、約 980Kb の長いリストがあり、特にリストが大きくなり、サイズが変更されてメモリに穴が残る場合に、通常、断片化を引き起こす可能性があります。
したがって、基本的にはリストのリストである複合リストを作成しました。各リストは85000バイト未満になるため、ガベージコレクション後に圧縮される通常のヒープに割り当てられるという考えです(Large Object Heapとは異なり、圧縮されることはありません)
他の人がリストのリストを使用してオブジェクトがラージ オブジェクト ヒープから確実に逃れるようにするために、複合リストがそのトリックを実行することを期待していましたが、この場合、実際の違いはないようで、アプリケーション プールのメモリはまだ約 240Mb ですが、メモリ プロファイラーはドット ネット CLR メモリを約 10Mb と報告しています。
何が起こっているのかを確認するためにメモリダンプを実行する予定ですが、他の誰かが考えられる原因について見解を持っているかどうか疑問に思いました.
c# - 大規模なコレクションをシリアル化する方法
私は、500 万を超える項目を持つリストと辞書を持つシステムを使用しています。各項目は通常、最大 90 のプリミティブ プロパティを持つフラットな dto です。コレクションは、回復力とサブシーケンス処理のために protobuf-net を使用してディスクに永続化されます。
当然のことながら、処理中とシリアル化中に LOH に達しています。
ConcurrentBag などを使用して処理中に LOH を回避できますが、シリアライズ時に問題が発生します。
現在、コレクション内のアイテムは 1000 個のグループにバッチ処理され、並行してメモリ ストリームにシリアル化されます。各バイト配列は同時キューに配置され、後でファイル ストリームに書き込まれます。
これが何をしようとしているのかは理解できますが、複雑すぎるようです。LOH を使用せずに巨大なコレクションを処理する protobuf 自体の中に何かがあるはずです。
見落としている設定がいくつかあるという、男子生徒の間違いを犯したことを願っています。それ以外の場合は、カスタム バイナリ リーダー/ライターの作成を検討しています。
私たちは 4.0 を使用しており、すぐに 4.5 に移行することを検討していますが、GC の改善にもかかわらず、この問題を解決できないことを認識しています。
どんな助けでも感謝します。
asp.net-web-api - 大きなデータを返すときに Get メソッドが System.OutOfMemory 例外をスローする
30 MB (この範囲は GB になる可能性があります) などの大きなデータを返そうとすると、Web API コントローラー アクションは OutOfMemory 例外をスローします。この問題から抜け出す方法や、大きなオブジェクト グラフをクライアントに送り返す方法について別の方法を提案する方法を知っている人はいますか?
c# - LOH を多用すると重大なパフォーマンスの問題が発生する
Server 2012 で WebApi 2、.NET 4.5 を使用する Web サービスがあります。正当な理由もなく、時折 10 ~ 30 ミリ秒のレイテンシの増加が見られました。問題のあるコード部分を LOH と GC まで突き止めることができました。
UTF8 バイト表現に変換するテキストがいくつかあります (実際、使用するシリアライゼーション ライブラリはそれを行います)。テキストが 85000 バイトより短い限り、待ち時間は安定して短く、平均で 0.2 ミリ秒以下、99% です。85000 の境界を超えるとすぐに、平均レイテンシーは最大 1 ミリ秒に増加し、99% は 16 ~ 20 ミリ秒に跳ね上がります。Profiler は、ほとんどの時間が GC に費やされていることを示しています。確かに、反復間に GC.Collect を配置すると、測定されたレイテンシは 0.2ms に戻ります。
2 つの質問があります。
- レイテンシーはどこから来るのか? 私の知る限り、LOH は圧縮されていません。SOH は圧縮されていますが、待ち時間は表示されません。
- これを回避する実用的な方法はありますか?データのサイズを制御して小さくすることはできないことに注意してください。
--