私が行う作業には、SQLサーバーデータベースから大量のデータをメモリにダウンロードすることが含まれます。これを実現するために、SqlDataReaderを使用してロードするカスタムデータセット定義を用意し、Datatableを反復処理して各行をオブジェクトに構築し、通常はそれらのオブジェクトを大規模なディクショナリにパッケージ化します。
使用しているデータの量が十分に多いため、メモリの上限がある単一のデータテーブルに収まらない場合があります。辞書は、最も極端なケースでは8GBのシステムメモリを超えるほど大きくなりました。私は、データテーブルがオーバーフローしたときにスローされるメモリ不足の例外を修正するタスクを与えていました。これは、データテーブルの使用方法と矛盾しているように見えるバッチプロセスメソッドを実装することで実現しましたが、当面は機能しました。
私は今、このプロセスのメモリ要件をさらに削減するタスクを持っています。私の考えは、SqlDataReaderを受け取り、基本的にリーダーを列挙しているコレクションとして使用するIEnumeratorを継承する一般的に型指定されたクラスを作成することです。MoveNext()関数はリーダーを進め、Currentプロパティは、ビルダーメソッドからビルドされて指定された型付きオブジェクトをリーダーの現在の行から返します。
私の質問:これは実行可能なアイデアですか?私はそれのようなものをオンラインで聞いたことがない/見つけることができません。
また、ロジスティック的に:Currentプロパティが呼び出されたときに、型宣言が要求する特定のビルダー関数をどのように呼び出すのでしょうか。
私は愚かな考えを夢見ていることに対する批判と非難を受け入れています。私は、全体的な目標に近づくためのベストプラクティスを見つけることに最も興味があります。