4

私はいくつかのかなり大きな文字列を含むデータデータベースを持っており、それぞれがシリアル化された階層データコレクションを保持しています(データはVB6との相互作用を可能にするためにバイナリストリームとしてではなく文字列として保存されます)。私の知る限り、85,000バイトを超える文字列を返すデータベースクエリは、すぐにその文字列をラージオブジェクトヒープにスローします。文字列がすぐに小さな断片に分割され、大きなオブジェクトが短命になる場合、それらのオブジェクトが大きなオブジェクトヒープに移動し、次のLOHコレクションまで無駄にそこにとどまるのを回避する方法はありますか?私はLOHオブジェクトを再利用する必要があることを読み続けていますが、このコンテキストでそれをどのように行うのかわかりません。

編集-私はDataReaderでSqlClientオブジェクトを使用しています。

4

2 に答える 2

2

strings は不変であるため、再利用できません。

できることは、データベースからデータをストリーミングすることです ( ADO の例)。つまり、LOH を完全に回避できます。

または、列が十分に大きい限り、再利用できるchar配列 (または配列) に列を読み込むことができます。byte

ただし、これはすべて、使用しているデータベース プロバイダーまたは ORM によって異なります。

于 2011-06-05T16:33:44.690 に答える
1

LOH フラグメンテーションが問題になる可能性があることは事実ですが、問題であるとは限りません。私は、24 時間にわたって数千万の短期間の大きなオブジェクトを割り当てる長期実行プログラムを持っていますが、LOH ヒープの断片化に問題があったことは一度もありません。

これは知っておくべきことですが、一部の人が信じているほど一般的な問題ではないようです。LOH に問題があるという兆候が見られない限り、プログラムをそのまま実行することをお勧めします。

于 2011-06-05T17:09:45.843 に答える