LOHフラグメンテーションを引き起こさずに大きな文字列でRegExes(一致するものを見つける)をたくさん実行するにはどうすればよいですか?RegEx、StringBuilderおよびラージオブジェクトヒープフラグメンテーション
私はStringBuilder
を使用していますので、LOHにはありませんが、RegExを実行する必要があるとすぐに、StringBuilder.ToString()
と呼ぶ必要があります。つまり、LOHになります。
この問題の解決方法はありますか?このような大きな文字列やRegExesを扱う長時間実行されるアプリケーションを持つことは事実上不可能です。
この問題を解決するためのアイデア:
この問題について考えている間、私は汚い解決策を見つけたと思います。
与えられた時間に私は5つの文字列しか持たず、これら5つの文字列(85KBより大きい)はRegEx.Match
に渡されます。
新しいオブジェクトはLOHで空のスペースに収まらないので、断片化が発生するので、これは問題解決する必要があります:maxに
PadRight
すべての文字列を。受け入れられたサイズなので、すべての新しい文字列を行うことにより- (私は
StringBuider
でこれを行うために必要がある場合があります)のは、1024キロバイトを言わせて、前の文字列が範囲外に既にあるとして、既に空にするためにメモリに適合します - はので、任意の断片化が存在することはありませんオブジェクトのサイズは常に同じですので、私は与えられた時刻に1024 * 5しか割り当てません。LOHのこれらのスペースはこれらの文字列の間で共有されます。
他の大きなオブジェクトがこの場所をLOHに割り当てると、アプリケーションが1024 KBの文字列をたくさん割り当ててしまう可能性があります。 fixed
ステートメントは、固定メモリアドレスに配置されていない新しい文字列を実際に作成することなく、RegExに固定文字列を送信する方法を教えてください。
この理論に関するアイデアはありますか? (残念ながら問題を簡単に再現することはできませんが、私は一般にメモリプロファイラを使用して変更を観察し、どのような孤立したテストケースを作成できるかわかりません)
ラージオブジェクトヒープが断片化していることは確かですか?私は大きな(数百キロバイト)文字列で多くの作業を行い、LOHの断片化問題に遭遇したことはありません。 –
はい私は確信しています。アプリケーションは、実際の影響を見るためには、メモリが空いていて長時間実行する必要があります。実際にメモリプロファイリングを行っていると、それはあなたに影響を与えているかもしれませんが、アプリをクラッシュさせるほどのものではありません。 –
うん、それは簡単です。あなたは64ビットのオペレーティングシステムを購入しています。プログラミングの努力はそれに合うものではありません。 –