0

私は、かなりの量のデータをヒート マップの形で要約する必要があるプロジェクトに取り組んでいます。このデータは、可能な限りデータベースに保持されます。ある時点で、ヒート マップのブロックを画面に描画する前に、サマリーをマトリックスに保存する必要があります (おそらく?)。C#でWindowsフォームアプリケーションを作成しています。

ヒート マップが、Google マップなどのオンライン マッピング プログラムのログ ファイルを要約するとします。特定の住所または地域に対してリクエストが行われた回数に基づいて、特定の住所または地域に色を割り当てます。さまざまな詳細レベルでデータを要約できます。つまり、ヒート マップ上の各ブロックは、特定の住所のデータを要約したり (最大の詳細、したがって数十億/数百万のブロック)、道路、都市、または国への要求​​を要約したりできます (最小の詳細 -- 数ブロック)。それぞれが国を表しています)。何百万ものアドレスのリクエストが行われたと想像してください。これをデータベースにまとめることを検討しました。問題は、非常に多くのブロックを画面に描画する必要があることです (最大で数十億ですが、通常ははるかに少ない)。させて' このデータは、より大きな領域へのヒット数を格納するデータベース テーブルに要約されていると仮定します。各領域のオブジェクトを構築したり、db テーブルからすべての情報を取り込んだりすることなく、ブロックをウィンドウに描画できますか? マトリックスを作成すると、要求の厳しい要求に対して約 10 GB になる可能性があるため、これが私の主な関心事です。

画面に描画できるブロックの数と、これに対する最善のアプローチ (つまり、direct3d、XNA) を知りたいと思っています。上記から、範囲が大幅に変化することがわかります。数十億の正方形を描画する必要がある可能性が予想されます。他のブロックを表示するためにすばやく下にスクロールするための垂直スクロール バーがあります。

全体として、C# でこれをどのように達成できるのだろうか? 要求の厳しい要求のマトリックスを作成するには、約 10 ギガバイトが必要になる場合があります。大量のメモリを必要としない画面に描画する方法はありますか (つまり、ブロックごとにオブジェクトを作成します)。SQL クエリの結果を画面上にレンダリングされたブロックに直接変換できれば理想的です (つまり、オブジェクトを構築しないなど)。必要なのは正方形だけで、その唯一のプロパティは色であり、各ブロックの数を維持する必要がある場合があります。

注: ヒート マップをどのように描画するか (ズーム、スクロールなどがユーザーにどのように表示されるか) についてはかなり確信があります。明確にするために、私は私たちのアイデアをどのように実装するかについてもっと心配しています。10 億のオブジェクトを構築せず、ギガバイトのデータを使用せずに、これほど多くのオブジェクトを描画できるライブラリまたはメソッドはありますか? 各ブロックは基本的に、同じ色のピクセル (20x20) のグループです。これが 10 億個のオブジェクトを構築する必要があるとは思いません。

ありがとう!

4

2 に答える 2

1

これが本当にグラフィックヒートマップの場合、少なくとも780ラップトップ画面の幅の画像は実用的ではないというコメントに同意します。この情報がSQL(?)データベースのどこかにある場合は、結果を特定の幅のバケットに分割する高度なクエリを実行できます。データベースは、これらのレコードを1680(ピクセル幅)のバケットに効率的に集約できる必要があります。

さらに、バケットの幅が固定されている場合(固定幅のヒートマップイメージが生成される場合)、データベース内の「アドレス」のバケット番号を事前に生成できます。適切に索引付けすると、これによるグループ化は非常に高速になります。

1:1の画像を表示する必要がある場合は、スクロール先の画像の一部のみをレンダリングすることを検討してください。これにより、現在のビューを保存するために必要なメモリの量が大幅に削減されます。780画面分のデータすべてを100%で実際に表示する必要がないと仮定すると(特に、これを上記の「全体像」戦略と組み合わせると)、処理も節約できます。

「全体像ビュー」の集計関数は、MAX、SUM、AVGの場合があります。これらの機能が適切でない場合は、ヒートマップで探している特定の機能について詳しく説明してください。

描画自体に関しては、各ボックスに「オブジェクト」は必要ありません。グラフィックオブジェクトにピクセルを描画するだけです。

于 2011-02-27T19:56:31.190 に答える
0

あなたが探している技術は「仮想化」と呼ばれるものだと思います。ハードウェアの仮想化という意味ではなく、目に見えるものだけを対象に具体的なビジュアル オブジェクトを作成する手法です。多くのグリッドとリストは、この手法を使用して、通常の速度とメモリ消費で何千ものアイテムを表示します。具体的なデータ オブジェクトを交換しながら、これらのビジュアル オブジェクトを再利用することもできます。

また、何十億もの詳細を表示する必要性についても疑問を呈します。データのズームまたは集約に似たものにして、少数のアイテムのみを表示し、ユーザーがデータの特定の部分または部分を選択できるようにする必要があります。しかし、私はあなたがその考えを持っていると思います。

于 2011-02-27T20:09:16.890 に答える