2

私は C# で書かれたいくつかのライブラリを書き直して、起動が完了すると割り当てがないようにするタスクを与えられました。

30 秒ごとに OdbcConnection を介していくつかの DB クエリを実行する 1 つのプロジェクトにたどり着きました。私はいつも、OdbcDataReader を作成する .ExecuteReader() を使用してきました。独自の OdbcDataReader を再利用できるパターン (SocketAsyncEventArgs ソケット パターンなど) はありますか? または、割り当てを回避する他の賢い方法はありますか?

作業中のすべてのデータベースはOracleベースであり、最後にチェックしたところ、公式のLinq To Oracleプロバイダーがなかったため、わざわざLINQを学ぶことはありませんでした。しかし、Linq でこれを行う方法があれば、サードパーティのものを使用できます。

アップデート:

割り当てなしの要件の理由を明確に指定したとは思いません。重要なスレッドが 1 つ実行されており、フリーズしないことが非常に重要です。これはほぼリアルタイムの取引アプリケーション用であり、一部の Gen 2 コレクションでは最大 100 ミリ秒のフリーズが見られます。(ゲームが C# で同じように書かれているという話も聞いたことがあります)。コンプライアンス チェックを実行し、30 秒ごとに実行するバックグラウンド スレッドが 1 つあります。現在、dbクエリを実行しています。クエリは非常に遅い (すべてのデータを返すのに約 500 ミリ秒) ですが、重要なスレッドに干渉しないため問題ありません。ワーカー スレッドがメモリを割り当てている場合を除き、すべてのスレッドをフリーズさせる GC が発生します。

すべてのライブラリ (これを含む) は、起動後にメモリを割り当てることができないと言われました。私がそれに同意するかどうかにかかわらず、それは小切手に署名する人々からの要件です:)。

さて、明らかに、割り当てなしでこのプロセスにデータを取得する方法があります。別のプロセスをセットアップし、ソケットを使用してこのプロセスに接続できます。新しい .NET 3.5 ソケットは、新しい SocketAsyncEventArgs パターンを使用して、まったく割り当てないように特に最適化されています。(実際、それらを使用して複数のシステムに接続し、それらから GC を確認することはありません。) 次に、ソケットから読み取ってデータを通過する事前に割り当てられたバイト配列を用意し、途中で文字列を割り当てません。(私は .NET の他の形式の IPC に詳しくないので、メモリ マップ ファイルと名前付きパイプが割り当てられるかどうかはわかりません)。

しかし、この no-alloc クエリを手間をかけずに実行するためのより高速な方法があれば、私はそれを好みます。

4

3 に答える 3

3

IDataReader(またはOdbcDataReader同等SqlDataReaderのクラス)を再利用することはできません。これらは、単一のクエリでのみ使用するように設計されています。これらのオブジェクトは単一のレコード セットをカプセル化するため、一度取得して反復すると、意味がなくなります。

とにかく、データ リーダーの作成は信じられないほど安価な操作であり、クエリを実際に実行するコストとは対照的に、ほとんどありません。この「割り当てなし」要件の論理的な理由がわかりません。

メモリを割り当てないようにライブラリを書き直すことは、ほぼ不可能であると言えます。整数のボックス化や文字列変数の使用などの単純なものでさえ、いくらかのメモリを割り当てます。何らかの方法でリーダーを再利用することができたとしても (説明したようにそうではありません)、データベースにクエリを再度発行する必要があり、クエリを準備して送信するという形でメモリを割り当てる必要があります。ネットワーク経由、結果の再取得など。

メモリ割り当てを回避することは、実際的な目標ではありません。特定の操作がメモリを使いすぎていると判断した場合は、特定の種類のメモリ割り当てを回避することをお勧めします。

于 2010-04-10T20:59:36.017 に答える
2

そのような要件に対して、C# のような高水準言語を選択することを確信していますか?
使用している .NET ライブラリ関数が内部的にメモリを割り当てているかどうかはわかりません。標準ではそれが保証されていないため、現在のバージョンの .NET Framework で割り当てを使用していない場合は、後で使用を開始する可能性があります。

于 2010-04-10T21:00:26.373 に答える
1

アプリケーションのプロファイルを作成して、時間やメモリが費やされている場所を特定することをお勧めします。推測しないでください - 推測が間違っているだけです。

于 2010-04-10T21:01:32.280 に答える