C#(.NET 4.0)で記述された.NETアプリケーションがあります。このアプリケーションでは、ファイルから大きなデータセットを読み取り、その内容をグリッドのような構造で表示する必要があります。そこで、これを実現するために、フォームにDataGridViewを配置しました。3つの列があり、すべての列データはファイルから取得されます。当初、ファイルには、DataGridViewの600.000行に対応する約600.000レコードが含まれていました。
DataGridViewがこのような大きなデータセットで崩壊することにすぐに気づいたので、仮想モードに切り替えました。これを実現するために、最初にファイルを3つの異なる配列(3つの列に対応)に完全に読み取り、次にCellValueNeededイベントが発生し、配列から正しい値を提供します。
ただし、すぐにわかったように、このファイルには膨大な数のレコードが含まれている可能性があります。レコードサイズが非常に大きい場合、すべてのデータを配列またはリスト<>などに読み込むことは実行不可能であるように見えます。すぐにメモリ割り当てエラーが発生します。(メモリ不足の例外)。
私たちはそこで立ち往生しましたが、なぜ最初にすべてのデータを配列に読み込むのか、CellValueNeededイベントが発生したときにオンデマンドでファイルを読み込むのはなぜですか?これが現在の作業です。ファイルを開きますが、何も読み取りません。CellValueNeededイベントが発生すると、最初にファイル内の正しい位置にSeek()を実行し、次に対応するデータを読み取ります。
これは私たちが思いつくことができる最高のものですが、まず第一に、これは非常に遅いため、アプリケーションが遅くなり、ユーザーフレンドリーではありません。第二に、これを達成するためのより良い方法がなければならないと考えざるを得ません。たとえば、一部のバイナリエディタ(HXDなど)は、どのファイルサイズでも目がくらむほど高速なので、これを実現する方法を知りたいと思います。
さらに、DataGridViewの仮想モードで、RowCountをファイル内の使用可能な行数(たとえば16.000.000)に設定すると、DataGridViewがそれ自体を初期化するまでに時間がかかります。この「問題」についてのコメントもいただければ幸いです。
ありがとう