DOBON.NETプログラミング道掲示板
HOME
HELP
新規作成
新着記事
ツリー表示
スレッド表示
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
[
最新記事及び返信フォームをトピックトップへ
]
[ トピック内全5記事(1-5 表示) ] <<
0
>>
■35451
/ inTopicNo.1)
DataGridViewのVirtualModeを有効した場合の実装方法
▼
■
□投稿者/ 炎の妖精さん
一般人(27回)-(2023/06/12(Mon) 13:30:32)
環境/言語:[Win10/VB.NET/Framework3.5/VS2010]
分類:[.NET]
お世話になり、いつも助けていただき感謝です。
此度の件もお付き合いいただければ恐縮です。
DataGridViewに約50〜1000万件のデータを表示させたいと考えており、
DataTableに膨大なデータを挿入して、DataGridViewのDataSourceを設定すると"system.outofmemoryexception"のエラーが発生します。
ネットで調べると仮想モード(VirtualMode)を有効にするとメモリ使用量を抑えることが出来るとの記載があった為、試しに実装しました。
●技術レポート「DataGridViewコントロールのVirtualMode(仮想モード)について」
https://www.softech.co.jp/mm_200506_tr.htm
今回はデータを表示させたいだけであり、新規行や削除、値の変更は全くありませんので"DataGridView.CellValueNeeded"のみの実装で良いかなと思いましたので
実装したのですが、状況は変わらずメモリ不足のエラーが発生しました。
どのように実装すればメモリ消費を抑えるコードが書けるのでしょうか?
恐縮ですが、何卒よろしくお願いいたします。
マルチポストを報告
Javascriptを有効にしてください
この投稿がマルチポスト(全く同じ内容の投稿が別の掲示板に投稿されている)の場合は、以下のフォームをご利用いただくと、報告の投稿が簡単に行えます。
このフォームに必要事項を入力後、「返信フォームに入力する」ボタンをクリックすると、このページの下にある
返信フォーム
の項目が自動的に埋まります。実際に投稿するには、その後、返信フォームの「送信」ボタンをクリックしてください。
このフォームを利用しても返信フォームが埋まるだけですので、後で書き直してから投稿することもできます。
「マルチポストされている場所」には、マルチポストされている場所のURLを入力してください。複数のURLを改行区切りで入力することができます。
マルチポストされている場所
オプション
マルチポスト先の投稿が、別人によるいたずらである可能性が高い
違反を報告
Javascriptを有効にしてください
この投稿が掲示板のルールに違反しており、何らかの対処が必要であると思われる場合は、以下のフォームを利用して管理人に報告することができます。
マルチポストの報告は、
返信フォーム
の上にある「マルチポストの報告」リンクをご利用ください。
この機能の悪用は絶対にしないでください。
悪用されたと管理人が判断した場合は、予告なしで厳しい対処がなされる可能性があります。
確認等の目的で、入力されたメールアドレス宛に返信メールが送信される可能性があります。メールの受信ができないメールアドレスは入力しないでください。
下のフォームが使用できない場合は、
メールフォーム
を使って管理人にご報告ください。
お名前(必須)
メールアドレス(必須)
本文(必須)
(違反理由など)
引用返信
削除キー/
編集
削除
■35453
/ inTopicNo.2)
Re[1]: DataGridViewのVirtualModeを有効した場合の実装方法
▲
▼
■
□投稿者/ 魔界の仮面弁士
大御所(1553回)-(2023/06/12(Mon) 16:00:50)
■
No35451
に返信(炎の妖精さんさんの記事)
> DataGridViewに約50〜1000万件のデータを表示させたいと考えており、
仮に 1 レコード当たり 32 バイト程度のデータであったとしても、
1000万レコードあったら、300MB 級のデータサイズになりますね。
これらが Web Service として通信される場合、JSON や XML 化のために
さらに数倍のデータ量が要求されることになるかもしれません。
> ネットで調べると仮想モード(VirtualMode)を有効にするとメモリ使用量を抑えることが出来るとの記載があった為、試しに実装しました。
どのように実装しましたか。
実際に試せるような実験コードが提示されていないので、
以下、概要のみの回答となりますが:
> DataTableに膨大なデータを挿入して、DataGridViewのDataSourceを設定すると"system.outofmemoryexception"のエラーが発生します。
DataGridView の仮想モードであれ、ListView の仮想モードであれ、
そもそも 1000万件のデータを画面に表示して、そのすべてをスクロールして
その 1件 1件をすべて閲覧するという事は非常に稀であり、
実際に必要なデータはごく一部だけであろうかと思います。
なので仮想モードにおいては、「現在見えているページ」、「スクロールで要求されたページ」のための
必要最小限の小さなデータを、必要に応じてサーバーから動的に読み込むという実装をとります。
Google Map で地図をスクロールするたびに Web 通信が行われる状況に似ていますね。
一度読み込んだデータでも、別の領域をロードしたらまた忘れられてしまうので、
以前の情報をとっておきたい場合は、独自のキャッシュ処理を追加します。
(いずれにしても、大量データを保持し過ぎることが無いような設計が求められます)
https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/virtual-mode-with-just-in-time-data-loading-in-the-datagrid?view=netframeworkdesktop-4.8
違反を報告
Javascriptを有効にしてください
この投稿が掲示板のルールに違反しており、何らかの対処が必要であると思われる場合は、以下のフォームを利用して管理人に報告することができます。
マルチポストの報告は、
返信フォーム
の上にある「マルチポストの報告」リンクをご利用ください。
この機能の悪用は絶対にしないでください。
悪用されたと管理人が判断した場合は、予告なしで厳しい対処がなされる可能性があります。
確認等の目的で、入力されたメールアドレス宛に返信メールが送信される可能性があります。メールの受信ができないメールアドレスは入力しないでください。
下のフォームが使用できない場合は、
メールフォーム
を使って管理人にご報告ください。
お名前(必須)
メールアドレス(必須)
本文(必須)
(違反理由など)
引用返信
削除キー/
編集
削除
■35454
/ inTopicNo.3)
Re[2]: DataGridViewのVirtualModeを有効した場合の実装方法
▲
▼
■
□投稿者/ 魔界の仮面弁士
大御所(1554回)-(2023/06/12(Mon) 16:11:32)
■
No35453
に追記(魔界の仮面弁士の記事)
> (いずれにしても、大量データを保持し過ぎることが無いような設計が求められます)
> https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/virtual-mode-with-just-in-time-data-loading-in-the-datagrid?view=netframeworkdesktop-4.8
上記サンプルの場合、表示領域に合わせて、
Select Top 【rowsPerPage】列1, 列2, 列3, …
From テーブル名
Where ソート条件列 NOT IN
(
Select Top 【lowerPageBoundary】 ソート条件列
From テーブル名
Order By ソート条件列
)
Order By ソート条件列
という SQL Server への問い合わせが行われる想定ですね。
違反を報告
Javascriptを有効にしてください
この投稿が掲示板のルールに違反しており、何らかの対処が必要であると思われる場合は、以下のフォームを利用して管理人に報告することができます。
マルチポストの報告は、
返信フォーム
の上にある「マルチポストの報告」リンクをご利用ください。
この機能の悪用は絶対にしないでください。
悪用されたと管理人が判断した場合は、予告なしで厳しい対処がなされる可能性があります。
確認等の目的で、入力されたメールアドレス宛に返信メールが送信される可能性があります。メールの受信ができないメールアドレスは入力しないでください。
下のフォームが使用できない場合は、
メールフォーム
を使って管理人にご報告ください。
お名前(必須)
メールアドレス(必須)
本文(必須)
(違反理由など)
引用返信
削除キー/
編集
削除
■35455
/ inTopicNo.4)
Re[3]: DataGridViewのVirtualModeを有効した場合の実装方法
▲
▼
■
□投稿者/ 魔界の仮面弁士
大御所(1555回)-(2023/06/12(Mon) 19:00:19)
■
No35454
に追記(魔界の仮面弁士の記事)
> 上記サンプルの場合、表示領域に合わせて、
> という SQL Server への問い合わせが行われる想定ですね。
SQL Server 2012 以降や Oracle12c以降であれば、
ORDER BY 句 で OFFSET と FETCH を使うことでページングできます。
https://sql55.com/query/paging-query-results.php
ページ指定での分割読取り手法は、お使いのデータベースによって
使用可能な構文も異なるでしょうし、そこは随時調整してください。
違反を報告
Javascriptを有効にしてください
この投稿が掲示板のルールに違反しており、何らかの対処が必要であると思われる場合は、以下のフォームを利用して管理人に報告することができます。
マルチポストの報告は、
返信フォーム
の上にある「マルチポストの報告」リンクをご利用ください。
この機能の悪用は絶対にしないでください。
悪用されたと管理人が判断した場合は、予告なしで厳しい対処がなされる可能性があります。
確認等の目的で、入力されたメールアドレス宛に返信メールが送信される可能性があります。メールの受信ができないメールアドレスは入力しないでください。
下のフォームが使用できない場合は、
メールフォーム
を使って管理人にご報告ください。
お名前(必須)
メールアドレス(必須)
本文(必須)
(違反理由など)
引用返信
削除キー/
編集
削除
■35457
/ inTopicNo.5)
Re[4]: DataGridViewのVirtualModeを有効した場合の実装方法
▲
▼
■
□投稿者/ 炎の妖精さん
一般人(28回)-(2023/06/13(Tue) 11:18:22)
魔界の仮面弁士様
いつも助けていただきまして、ありがとうございます。
> ■
No35454
に追記(魔界の仮面弁士の記事)
>> 上記サンプルの場合、表示領域に合わせて、
>> という SQL Server への問い合わせが行われる想定ですね。
>
> SQL Server 2012 以降や Oracle12c以降であれば、
> ORDER BY 句 で OFFSET と FETCH を使うことでページングできます。
> https://sql55.com/query/paging-query-results.php
>
> ページ指定での分割読取り手法は、お使いのデータベースによって
> 使用可能な構文も異なるでしょうし、そこは随時調整してください。
イメージとしましてはECサイトの検索画面のような感じでしょうか?
1ページで20,30件を表示させ、ページ送りが出来るようなイメージです。
その手法をとるなら、やりたいことが実現できるかも知れません。
一度、検討させていただきます。
解決
済
み!
違反を報告
Javascriptを有効にしてください
この投稿が掲示板のルールに違反しており、何らかの対処が必要であると思われる場合は、以下のフォームを利用して管理人に報告することができます。
マルチポストの報告は、
返信フォーム
の上にある「マルチポストの報告」リンクをご利用ください。
この機能の悪用は絶対にしないでください。
悪用されたと管理人が判断した場合は、予告なしで厳しい対処がなされる可能性があります。
確認等の目的で、入力されたメールアドレス宛に返信メールが送信される可能性があります。メールの受信ができないメールアドレスは入力しないでください。
下のフォームが使用できない場合は、
メールフォーム
を使って管理人にご報告ください。
お名前(必須)
メールアドレス(必須)
本文(必須)
(違反理由など)
引用返信
削除キー/
編集
削除
このトピックをツリーで一括表示
トピック内ページ移動 / <<
0
>>
このトピックに書きこむ
入力内容にタグは利用できません。
引用部分(行頭に「>」や「■」が付いている部分)が全体の 80% 以上のコメントは投稿できません。
半角カナは使用しないでください。文字化けの原因になります。
削除キーを覚えておくと、自分の記事の編集・削除ができます。
記事中に No*** のように書くとその記事にリンクされます(No は半角英字/*** は半角数字)。
使用例)
No123 → 記事No123の記事リンクになります(指定表示)。
No123,130,134 → 記事No123/130/134 の記事リンクになります(複数表示)。
No123-130 → 記事No123〜130 の記事リンクになります(連続表示)。
投稿前に必ずお読みください
初めて投稿される方は、必ず「
書き込みのルールについて(12/4/2更新)
」をお読みください。
読むのが面倒、ルールを守りたくないという方は、「
お気楽掲示板
」へ投稿してください。
質問を投稿する場合は、「
質問をする際のアドバイス
」を参考にしてください。
投稿は、明記のない限り、パブリックドメインになります。
マルチポストされた投稿を報告する時は匿名で投稿し、マルチポストされている場所を併記してください。以下のリンクをクリックしていただくと、自動で下のフォームが埋まりますので、その後「送信」ボタンを押してご投稿ください。
マルチポストの報告をする
マルチポストの報告をするが、マルチポスト先の投稿が嫌がらせである(元の投稿者とは別人が行なっている)可能性が高い
(投稿日時に開きがあり、こちらの投稿の方が早い場合は、その可能性が高いです)
Name
/
E-Mail
/
Title
/
URL
/
Comment/ 通常モード->
図表モード->
(適当に改行して下さい/半角10000文字以内)
■No35457に返信(炎の妖精さんさんの記事) > 魔界の仮面弁士様 > いつも助けていただきまして、ありがとうございます。 > >>■No35454に追記(魔界の仮面弁士の記事) > >> 上記サンプルの場合、表示領域に合わせて、 > >> という SQL Server への問い合わせが行われる想定ですね。 > > >>SQL Server 2012 以降や Oracle12c以降であれば、 >>ORDER BY 句 で OFFSET と FETCH を使うことでページングできます。 >>https://sql55.com/query/paging-query-results.php >> >>ページ指定での分割読取り手法は、お使いのデータベースによって >>使用可能な構文も異なるでしょうし、そこは随時調整してください。 > > イメージとしましてはECサイトの検索画面のような感じでしょうか? > 1ページで20,30件を表示させ、ページ送りが出来るようなイメージです。 > > その手法をとるなら、やりたいことが実現できるかも知れません。 > 一度、検討させていただきます。 >
File
/
アップ可能拡張子=> /
.gif
/
.jpg
/
.png
/.zip
1) 太字の拡張子は画像として認識されます。
2) 画像は初期状態で縮小サイズ250×250ピクセル以下で表示されます。
3) 同名ファイルがある、またはファイル名が不適切な場合、
ファイル名が自動変更されます。
4) アップ可能ファイルサイズは1回
20KB
(1KB=1024Bytes)までです。
5) ファイルアップ時はプレビューは利用できません。
6) スレッド内の合計ファイルサイズ:[0/300KB]
残り:[300KB]
Icon
/
ホイールロボ
くるりロボ
ぱんだ
ふとめネコ
ねずみ
こあら
疑問ねこ
ランダム
管理者用
(画像を選択/
サンプル一覧
)
削除キー
/
(半角8文字以内)
解決
済
み!
BOX/
解決したらチェックしてください!(スレッドを閉じる目的ではチェックしないでください!)
クリエイティブ・コモンズ・ライセンス
を Comment の末尾に挿入するには、以下のリンクをクリックしてください。(Javascript で挿入しているだけです。)
表示(CC BY)
|
表示-改変禁止(CC BY-ND)
|
表示-継承(CC BY-SA)
|
表示-非営利(CC BY-NC)
|
表示-非営利-改変禁止(CC BY-NC-ND)
|
表示-非営利-継承(CC BY-NC-SA)
プレビュー/
クッキーに保存しない/
Mode/
通常管理
表示許可
Pass/
HOME
HELP
新規作成
新着記事
ツリー表示
スレッド表示
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
-
Child Tree
-