問題タブ [memory-profiling]
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++ - キャッシュミスの代償はいくらですか
私はいくつかのコードを分析し、cachegrindを使用して実行中のキャッシュミス(L2とL3)の数を取得しています。
私の質問は、キャッシュミスに基づいて、キャッシュが準備完了になるのを待つために費やす時間をどのように決定するかです。
「私のコードは90%のCPU使用率を取得します」のようなことを言いたいです
キャッシュグラインド出力に基づいてこれを行うことは可能ですか?
c++ - C++のチェックポイントベースのメモリ使用量プロファイリングをサポートするツールはありますか
私はネットワークベースのアプリケーションに取り組んでいます。初期化とリリースの間のメモリ使用量や送信と受信の間のメモリ使用量など、アプリケーションのさまざまな段階間のメモリ使用量を確認したいと思います。私はグーグルで解決策を見つけようとしましたが、私の要件に完全に一致する投稿はありません。
LinuxとWindowsプラットフォームの両方でチェックポイントベースのメモリプロファイリングを実行するのに役立つツールやプロセスを提案してください。
前もって感謝します
次のコード
出力をくれます
Windows7UltimateでVisualStudio2010Professionalを使用しています。
python - Python のメモリ使用量: memory_profiler と guppy の違いは何ですか?
特定の Python スクリプトのメモリ使用量について完全に混乱しています。いくつかの SO Questions/ Answersからのアドバイスにもかかわらず、使用法をプロファイルする方法が本当にわからないと思います。
私の質問は次のとおりです。との違いは何ですか? 1 つは大量のメモリを使用していると言われ、もう 1 つはそうではないと言われるのはなぜですか?memory_profiler
guppy.hpy
私はpysam
、バイオインフォマティクスの SAM/BAM ファイルにアクセスするためのライブラリである を使用しています。私のメイン スクリプトは、SAM (ASCII) を BAM (バイナリ) に変換し、その間にファイルを操作するときに、すぐにメモリ不足になります。
各ステップでどれだけのメモリが割り当てられるかを理解するために、小さなテスト例を作成しました。
memory_profiler ( python -m memory_profiler test_pysam.py
) を使用してメモリ使用量を監視すると、次の出力が得られます。
@profile
次に、デコレータをコメントアウトし、guppy
関連する行のコメントを解除すると、次の出力が得られます ( python test_pysam.py
)。
行 13 の合計サイズは、あるケースでは 529.03 MB、別のケースでは 624 バイトです。ここで実際に何が起こっているのですか?「test.sam」は ~52MB の SAM (これも ASCII 形式) ファイルです。pysam
に関連する C ライブラリのラッパーであるため、 を深く掘り下げるのは少し難しいですsamtools
。が実際に何であるかに関係なく、Samfile
それを作成するためにどれだけのメモリが割り当てられているかを知ることができるはずだと思います。大規模で複雑な Python プログラムの各ステップのメモリ使用量を正しくプロファイリングするには、どの手順を使用すればよいですか?
ruby - Ruby の GC.stat のフィールドは何を意味していますか?
GC.stat
Rails アプリでメモリ使用量をプロファイリングするため に使用しています。GC.stat
次のキーを持つハッシュを返します。
これらの値の意味を正確に知っている人はいますか? Ruby ソース ( gc.c ) にはそれらのドキュメントはなく、「ハッシュの内容は実装定義であり、将来変更される可能性があります」というコメントだけです。
これらのフィールドの一部はコンテキストから意味を成します。たとえばcount
、Ruby が割り当てたヒープの数です。しかし、何heap_final_num
ですか?とはheap_increment
? heap_length
最小ヒープサイズは?
RUBY_MIN_HEAP_SLOTS
、RUBY_FREE_MIN
およびをいじっていますが、これらの環境変数を変更しても、またはRUBY_GC_MALLOC_LIMIT
には影響がないようです。最小ヒープスロットを大幅に増やすと、それが下がると予想されます。ですから、すべての値が何を表しているのかを正確に知りたいのです!:heap_count
:heap_length
:heap_count
GC.stat
Ruby 1.9.3 を使用しています。
c++ - 高性能金融アプリケーションでのキャッシング
取引戦略を最適化することを目的としたアプリケーションを作成しています。簡単にするために、「ここに入る」というトレーディング戦略と、「トレードの場合はここでエグジットする」という別のトレーディング戦略があると仮定して、2 つのモデルを用意します。市場の反対側にいる場合に失う金額) と、どれだけの利益を得る必要があるか (つまり、市場が同意した場合にどれだけの利益を得るか) を示します。
簡単にするために、過去の実現取引をティックと呼びます。つまり、「ティック 28 でエントリー」した場合、これは、データセットの 28 番目のトレードの時点で、このトレードの価格でトレードをエントリーしたことを意味します。ティックはデータセットに時系列で保存されます。
ここで、データセット全体に対するエントリ戦略が 500 エントリになると想像してください。エントリごとに、正確なエントリ ティックを事前に計算できます。また、各エントリ ポイントのエグジット戦略によって決定されるエグジット ポイントを計算することもできます (これもティック数として)。各エントリについて、モデル化された損失と利益、およびこれらの損失または利益が発生したティックを事前に計算することもできます。最後に行わなければならないことは、最初に何が起こったかを計算することです。つまり、戦略の終了、損失の終了、または利益の終了です。
したがって、取引の配列を繰り返し処理し、exitTick[i] = min(exitTickByStrat[i], exitTickByLoss[i], exitTickByProfit[i]) を計算します。そして、プロセス全体が非常に遅いです (これを 1 億回行うとしましょう)。キャッシュミスが主な原因だと思います。問題は、これをどうにかして高速化できるかどうかです。自明ではない長さの 4 つの配列を反復処理する必要があります。私が思いついた 1 つの提案は、データを 4 つのタプルにグループ化することです。つまり、(entryTick、exitOnStrat、exitOnLoss、exitOnProfit) のような構造体の配列を 1 つ持つことです。キャッシュの予測可能性が向上したため、これは高速になる可能性がありますが、確かなことは言えません。これまでテストしていないのは、プロファイラーのサンプリングが信頼できないように見えるのに対し、プロファイラーの計測がアプリのリリースバイナリに対して何らかの形で機能しないためです (Intel のプロファイラーを試しました)。
最後の質問は、この問題を高速化できるかどうかです。リリース バイナリを使用したメモリ プロファイリングに使用する最適なプロファイラーは何ですか? 私はWin7、VS2010で作業しています。
編集:すべてに感謝します。元の質問をできるだけ単純化しようとしたため、混乱しました。読みやすいように、ターゲットは予想/実現利益を意味し、ストップは予想/実現損失を意味します。
オプティマイザーは力ずくです。したがって、いくつかのストラト設定 (インジケーター期間など)、最小/最大 breakEvenAfter/breakEvenBy、そしてストップ/ターゲット値をティックで与える数式があります。これらの式も最適化の対象です。したがって、私は次のような最適化の構造を持っています
そのため、私は可能な限り事前に計算し、必要な場合にのみ計算します。そして、30 秒のうち、計算は evaluateExitsAndDetermineImprovement() 関数で 25 秒を費やします。この関数は、元の質問で説明したこと、つまり min(exitOnPattern, exitOnStop, exitOnTarget) を選択します。関数を 1 億回呼び出す必要があるのは、すべてのパラメーターを組み合わせた組み合わせが 1 億回あるためです。ただし、最後の for サイクル内では、exitOnStops 配列のみが変更されます。それが役立つ場合は、いくつかのコードを投稿できます。すべてのコメントに感謝します!
python - メモリ効率の良い Python バッチ処理
質問
バイナリ データをロードし、numpy 操作を実行し、結果を保存する小さな python バッチ プロセッサを作成しました。必要以上に多くのメモリを消費します。同様のスタックオーバーフローの議論を見て、さらに推奨事項を求めたいと思います。
バックグラウンド
スペクトル データを RGB に変換します。スペクトル データは、Band Interleaved by Line (BIL) イメージ ファイルに保存されます。そのため、データを 1 行ずつ読み取って処理します。numpy 配列を返すSpectral Python Libraryを使用してデータを読み取ります。hypは大きなスペクトル ファイルの記述子です: hyp.ncols=1600、hyp.nrows=3430、hyp.nbands=160
コード
メモリ消費量
すべてのビッグデータはループの外で初期化されます。私の素朴な解釈は、メモリ消費量が増えてはならないというものでした (Matlab を使いすぎたのでしょうか?) 増加係数 10 について説明してもらえますか? hyp.nrows = 3430 であるため、これは線形ではありません。メモリ管理を改善するための推奨事項はありますか?
ノート
rangeをxrangeに置き換えましたが、劇的な改善はありませんでした。三次補間が最速ではないことは承知していますが、これは CPU 消費に関するものではありません。
c# - WPFGarbageCollectionの高度なデバッグアドバイス
状況
しばらくの間メモリを解放しない大規模なWPFアプリケーションを実行しています。メモリは最終的に解放されるため、実際のメモリリークではありません。通常、これは問題とは見なされないことを私は知っています。残念ながら、これはWPFコマンドインフラストラクチャに関連するパフォーマンスの問題になります。詳細については、以下を参照してください。
調査結果
一般的なユースケースを実行する自動テストがあります。一部のケースは正常に機能しており、時間内にメモリを解放しています。他の人は、クライアントが最小化されるか、新しいウィンドウが開かれるか、Gen2コレクションをトリガーする他の条件が発生するまでメモリを占有しています。
•ANTSを使用すると、オブジェクトにはGCルートがありませんが、ファイナライズが必要な他のオブジェクトへの参照が多数あることがわかります。
•WinDbgは、ファイナライズの準備ができているオブジェクトを表示しません。
•複数実行するとGC.Collect()
、GC.WaitForPendingFinalizers()
メモリが完全に解放されます。
•どのUIアクションが高メモリ状態を引き起こしているのかはわかっていますが、疑わしいコードを特定できませんでした。
質問
このような問題のデバッグに関するアドバイスをいただければ幸いです。
WPFCommandManagerの背景
WPF CommandManagerは、イベントを発生_requerySuggestedHandlers
させるためのWeakReferences()のプライベートコレクションを保持します。CanExecuteChanged
処理CanExecuteChanged
にはかなりのコストがかかります(特に、のEventRouteを見つけることはCanExecute
明らかにですRoutedEvent
)。CommandManagerは、コマンドを実行できるかどうかを再クエリするように感じるときはいつでも、このコレクションを繰り返し処理CanExecuteChanged
し、それぞれのコマンドソースでイベントを呼び出します。
参照されるオブジェクトのGCハンドルがある限り、WeakReferencesはそのコレクションから削除されません。オブジェクトが収集されていない間、CommandHelperはCanExecute
これらの要素(ButtonBaseまたはMenuItems)のイベントを処理し続けます。ガベージが多い場合(この場合のように)、CanExecuteイベントハンドラーの呼び出しが非常に多くなり、アプリケーションが非常に遅くなる可能性があります。
windows-mobile - Windows Mobile 6.0 用の適切なメモリ プロファイリング ツールはありますか?
私はそれを少しグーグルで調べましたが、マークの解決策まで見つけることができませんでした。次に、StackOverflow に関する専用の質問をすることを考えました。誰でもアイデアを持っています。
.net - windbgおよびSciTechプロファイラー:x64メモリダンプ用のデータアクセスDLLのロードに失敗しました
私はこれが何度も尋ねられたことを知っていますが、まあ、私はそれらをすべて読み、問題を解決することができませんでした。
基本的に、AzureでWebロールとして実行されているIIS 7.0x64w3wp.exeプロセスのメモリダンプがあります。複数のダンプがあり、windbgまたはSciTech .NetMemoryProfilerにそれらをロードできません。どちらの場合も、問題は正しいmscordacwks.dllを見つけることのようです。
マシンからx64とx86の両方のmscordacwks.dllを取得しましたが、いずれもロードできませんでした。
したがって、windbgで管理対象スレッドなどを表示したい場合、よくあるエラーが発生します。
だから私はここに2つの奇妙なことがわかります:
- WindowsはAzureのD:\ドライブに展開されます(これにより問題が発生する可能性がありますか?)
- CLRバージョン:4.0.30319。551、ただしSOSバージョン:4.0.30319。17929
それで、 17929であるSOSバージョンである可能性がありますか?サーバー上のmscordacwks.dllは間違いなく551です。
問題を解決せずに想像できるすべてのコマンドラインを実行しました。
前もって感謝します
profiling - jvisualvmを使用したメモリサンプリング
Java Visual VMのメモリサンプリング機能を使用していますが、質問に答えることができません。
なぜこれほど多くのインスタンスが作成されるのですか?
これらのインスタンスとバイトの数が増え続けるのはなぜですか?
たとえば、次のように非常に単純なJavaプログラムを作成しました。
そして、JavaVisualVMには611のクラスがあることがわかります。インスタンスの数は、25,000から50,000近くまで増加し続け、その後、約25,000にフォールバックします。インスタンスが減少する理由はGCが原因である可能性がありますが、プログラムで何もしていないのに、なぜこれらの数値がそれほど動的であるのかわかりません。