C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.7492 の関連記事表示

<< 0 >>
■7492  Re[3]: 文字列の構築
□投稿者/ επιστημη -(2006/10/13(Fri) 15:09:09)

    分類:[C#] 

    ベタ引用して[解決]? 失礼な奴っちゃなー
    # 教えてもらったら「ありがとう」だぞ。幼稚園で教わんなかったか?

記事No.7486 のレス /0過去ログ7より / 関連記事表示
削除チェック/

■7492  大量データを格納したDataSetのコピーについて
□投稿者/ アリパパ -(2007/09/06(Thu) 23:10:03)

    分類:[.NET 全般] 

    初めての書き込みになります。皆様、よろしくお願いします。

    開発環境:VisualStudio2005 開発言語:C#&ADO.NET OS:WinXP Pro

    現在、FormにDataGridViewを貼り付け、DataSetをバインディングした簡易データベースのようなアプリを
    作成しております。機能的にはフィールドの追加・削除等も出来るようになっており、この操作を行う際に
    は、メインのFormにて、DataSetのコピーを作成後、フィールド操作用のダイアログにこのコピーを渡して、
    そのダイアログにて、渡されたDataSetのコピーを操作して、DataColumnの登録・削除を行うというフロー
    をとっています。なおDataSetのコピーは、DataSet.Copy()にて行っています。
    ※フィールド操作用ダイアログがOKで終了した場合、コピー作成されたDataSetをメインのDataSetとして更新

    このフローを実行中に、問題が発生してしまいました。DataSetの持つレコードやフィールド数が多い場合、
    DataSet.Copy()の実行に非常に時間がかかるのです。ちなみにレコード数:30000、フィールド数:128で計
    測してみたのですが、50秒近くかかりました。アプリの仕様としてはレコード数の上限は60000、フィール
    ド数の上限は256とする予定なのですが、これではお話にならないレベルです。
    ※DataSetの容量が大きくなると、DataGridViewの動作も非常に遅くなり、これにも困っているのですが・・・

    他に方法はないものかと探してみたのですが、なかなか情報が得られませんでした。現状の状態ではアプリ
    として使い物にならず、非常に困っております。回避方法又は高速化の方法をご存じの方がおられましたら、
    些細な事でも助かりますので、ご教授頂けないでしょうか。

    宜しくお願い致します。
親記事 /過去ログ19より / 関連記事表示
削除チェック/

■7493  Re[1]: 大量データを格納したDataSetのコピーについて
□投稿者/ れい -(2007/09/06(Thu) 23:36:04)
    No7492 (アリパパ さん) に返信
    > このフローを実行中に、問題が発生してしまいました。DataSetの持つレコードやフィールド数が多い場合、
    > DataSet.Copy()の実行に非常に時間がかかるのです。ちなみにレコード数:30000、フィールド数:128で計
    > 測してみたのですが、50秒近くかかりました。アプリの仕様としてはレコード数の上限は60000、フィール
    > ド数の上限は256とする予定なのですが、これではお話にならないレベルです。
    > ※DataSetの容量が大きくなると、DataGridViewの動作も非常に遅くなり、これにも困っているのですが・・・
    >
    > 他に方法はないものかと探してみたのですが、なかなか情報が得られませんでした。現状の状態ではアプリ
    > として使い物にならず、非常に困っております。回避方法又は高速化の方法をご存じの方がおられましたら、
    > 些細な事でも助かりますので、ご教授頂けないでしょうか。
    >

    たくさんのレコード全てを同時に表示する必要は無いですよね?
    そんなに画面は大きくないですし。

    ですので、たくさんある場合は部分的に取得します。
    そうすればDataSet.CopyもDataGridViewも早く動作できますから。
記事No.7492 のレス /過去ログ19より / 関連記事表示
削除チェック/

■7494  Re[2]: 大量データを格納したDataSetのコピーについて
□投稿者/ アリパパ -(2007/09/07(Fri) 00:45:35)
    No7493 (れい さん) に返信

    れい様、早速の回答、ありがとうございます。

    > たくさんのレコード全てを同時に表示する必要は無いですよね?
    > そんなに画面は大きくないですし。
    >
    > ですので、たくさんある場合は部分的に取得します。
    > そうすればDataSet.CopyもDataGridViewも早く動作できますから。

    なるほど、部分的に取得するという方法があるのですね。
    現在はBindingNavigatorのDataSourceにDataSetをセットしているのですが、
    例えばこの際に、DataSetの一部をセットするというイメージでしょうか?
    なお気になるのはDataGridViewにてスクロールがされた場合は、どのように
    対応するのかという点です。不勉強で申し訳ありません。

    またDataSet.Copyの件ですが、フィールド操作画面にて、データ型の変更機
    能があり、データ型が変更された場合は、データを変換する必要があるため、
    メイン画面にて持つDataSetの全データをコピーしてフィールド操作画面に
    渡す必要があり、この部分は部分的に対応出来ないのです。うーん。。。
記事No.7492 のレス /過去ログ19より / 関連記事表示
削除チェック/

■7495  Re[3]: 大量データを格納したDataSetのコピーについて
□投稿者/ れい -(2007/09/07(Fri) 02:47:19)
    No7494 (アリパパ さん) に返信
    > ■No7493 (れい さん) に返信
    > なるほど、部分的に取得するという方法があるのですね。
    > 現在はBindingNavigatorのDataSourceにDataSetをセットしているのですが、
    > 例えばこの際に、DataSetの一部をセットするというイメージでしょうか?

    > なお気になるのはDataGridViewにてスクロールがされた場合は、どのように
    > 対応するのかという点です。不勉強で申し訳ありません。

    レコード数10、フィールド数10とかなら、適当なコードで何も考えなくても動きますが、
    「レコード数の上限は60000、フィールド数の上限は256とする予定」なのですよね?
    1フィールド1byteを無駄なく保存したとしても、1x256x60000 byte = 15.36Mbyteです。
    実際に必要とされるメモリは数倍〜数十倍になるでしょう。

    これは現在のPCや.Netでは無造作に扱っていい量ではありません。
    無駄な操作のないコードにする必要があります。

    使わない情報をADO.Netから取るのは無駄です。
    「見える分+少し」だけ取得するようにします。

    スクロールされ、持って無いデータを取得する必要があるなら、
    その分だけ追加で取得します。

    これにはDataGridViewのVirtualModeを使うといいでしょう。

    > またDataSet.Copyの件ですが、フィールド操作画面にて、データ型の変更機
    > 能があり、データ型が変更された場合は、データを変換する必要があるため、
    > メイン画面にて持つDataSetの全データをコピーしてフィールド操作画面に
    > 渡す必要があり、この部分は部分的に対応出来ないのです。うーん。。。

    いいえ。できるはずです。
    フィールド操作画面に、DataSet取得元のTableの情報を渡しておけば、
    データ型を変更する必要が出たときだけ、データを取得し、変更できます。

    せっかくADO.Netを使っているのに、
    一度に大量のデータを取得し、全データをオンメモリで操作する、
    なんていうのは無駄で危険です。
    それに、アリパパさんの言うような操作がすばやくできるなら、
    そもそもデータベースなんて要らないことになってしまいます。

    量を扱う部分はデータベースにまかせ、
    コードでは表示や操作に専念するよう、
    設計を見直したほうがいいです。
記事No.7492 のレス /過去ログ19より / 関連記事表示
削除チェック/

■7498  Re[4]: 大量データを格納したDataSetのコピーについて
□投稿者/ アリパパ -(2007/09/07(Fri) 10:16:25)
    れい様、ご教授ありがとうございます。

    > 使わない情報をADO.Netから取るのは無駄です。
    > 「見える分+少し」だけ取得するようにします。
    >
    > スクロールされ、持って無いデータを取得する必要があるなら、
    > その分だけ追加で取得します。
    >
    > これにはDataGridViewのVirtualModeを使うといいでしょう。

    有難うございます。早速調べてみました。MSDNにVirtualModeの実装サンプルがありました。
    なかなか難しそうですが、このサンプルを参考にトライしてみます。

    > いいえ。できるはずです。
    > フィールド操作画面に、DataSet取得元のTableの情報を渡しておけば、
    > データ型を変更する必要が出たときだけ、データを取得し、変更できます。
    >
    > せっかくADO.Netを使っているのに、
    > 一度に大量のデータを取得し、全データをオンメモリで操作する、
    > なんていうのは無駄で危険です。
    > それに、アリパパさんの言うような操作がすばやくできるなら、
    > そもそもデータベースなんて要らないことになってしまいます。
    >
    > 量を扱う部分はデータベースにまかせ、
    > コードでは表示や操作に専念するよう、
    > 設計を見直したほうがいいです。

    おっしゃる通りですね。
    フィールド操作画面起動時は、Table情報のみを受け渡し、データ型変更が行われた際に、
    メイン画面からデータを取得するイベントを設け対処したいと思います。

    貴重なご指摘、感謝致します。
記事No.7492 のレス /過去ログ19より / 関連記事表示
削除チェック/

■7706  Re[5]: 大量データを格納したDataSetのコピーについて
□投稿者/ アリパパ -(2007/09/13(Thu) 13:18:24)
    れい様、先日はご教授ありがとうございました。

    その後、DataGridViewのVirtualモードの実装にトライしてみましたら、
    何とか動くレベルになりました。やはり大量レコード扱い時のパフォーマンスは格段
    に進歩しました。

    ただこの実装に伴い、問題が出てしまいました。
    以前はDataSetをBindingNavigatorにセットし、BindingNavigatorのBindingSourceを
    DataGridViewのDataSourceとしてセットしておりました。そのため、BindingNavigator
    とDataGridViewのカレントの動きは同期が取れていました。
    Virtualモード実装後は、DataGridViewのDataSourceには何もセットしておりません。
    その為、BindingNavigatorでのカレントレコード移動リクエストがあった際に、Data
    GridViewのカレントセルを移動する必要があるのですが、bindingNavigatorPositionItem_TextChanged
    関数にて、DataGridViewのカレントセルを移動させようとすると、「SetCurrentCellAddressCore
    関数への再入呼び出しを生じるため、この操作は有効ではありません。」という例外
    が発生してしまい、回避方法が不明です。

    何か回避方法はありませんでしょうか。
    ご教授頂けますと幸いです。宜しくお願い致します。


記事No.7492 のレス /過去ログ19より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -