DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridで大量データを扱う

環境/言語:[VB2003]
分類:[.NET]

はじめまして。

DataGridで、
10万行×100列ぐらいの、
データを扱おうとしているのですが、

NewRowでは、
Gridを生成するのに時間がかかり過ぎて、
他の方法がないかと、悩んでいます。

やりたい事として、
10万行×100列のGridを事前に生成しておいて、
後で、データを記入していこうかと考えています。

また、csvのデータを一括で読み込んだり、書き込んだり等でも
使いたいのですが、

Gridの高速な生成方法等を御存知の方はいらっしゃいませんか?
kkkさん、はじめまして。

解決策ではないですが、参考になれば...
私も、以前にListBoxに、やはり何万件という大量の行を表示したいことがありました。
やはり、行を追加するだけでかなりの時間がかかってしまいます。
そこで、ListBoxを自前でユザーコントロールとして作って、
スクロールバーの値から表示されている行を計算して、表示されている部分だけを
自分で描画するという方法で、瞬時に表示することができました。
たぶん、Excelもこんな感じでセルを表示しているんだと思います。
> DataGridで、
> 10万行×100列ぐらいの、
> データを扱おうとしているのですが、

> Gridの高速な生成方法等を御存知の方はいらっしゃいませんか?

10行×200列を表示しようとすると表示されるのに5分はかかります・・・
列が増えると異常に遅いですね。(XP Pen4 3GHz Mem1GB)
現在解決方法がないか調べています。
わかりましたらまた追記しますね(^^;
ポンさん、ウニャーさん、返信有難うございます。

その後、「データ 連結 DataGrid」をキーワードに
http://support.microsoft.com/default.aspx?scid=kb;ja;317383

の記事をみつけ、一瞬で巨大なDataGridを作成する方法を見つけたのですが、
100列等の、長い列での、DataGridを作成するには、

クラスのプロパティを動的に作成し、
DataGridのDataSourceに読み込ませる方法が必要になりました。

この方法について、どなたか御存知の方はいらっしゃらないでしょうか?

合わせて、他の方法でも、
どなたか、巨大なGridを、行・列を共に動的に高速で作成する方法を御存知の方はいらっしゃらないでしょうか?
いろいろ試してみて表示速度を半分にまで縮めることができましたが
結果
0行×100列・・・16秒
0行×200列・・・3分11秒

・・・まだまだ遅いようです。

既存のヘルプに記載されている使用例で試しています。
当初、0行×100列を表示させるのに38秒掛かっていましたが
「TableStyles」の設定をはずすことによって16秒で表示が行えました。

200行にしてみると速度が比例しなくて極端に遅いです(;_;)
行の表示についてはさほど遅くはないです。
1000件表示で2秒で表示されるので大量データでも次ページ機能で対応ができます。

がんばって引き続き調査してみます!!!
以上!(ToT)ノ
「DataSource」のセットを列定義の後に記述することで
4000行×200列・・・4秒
と言う結果になりました。

記述する順番を変えただけですがかなり違ってくるんですね。
一つ一つのコードの意味をちゃんと理解して正しく使わないとだめってことですね。
まだまだ初心者から脱出できない模様・・・。
kkkさんのスレに便乗してすみませんでした。
DataGridの調査は他にもあるのでこれからも調査したいと思います。
kkkさんがんばってくださいね(^-^)v
ウニャーさん、返信ありがとうございます。

> 「DataSource」のセットを列定義の後に記述することで
> 4000行×200列・・・4秒
> と言う結果になりました。
>
> DataGridの調査は他にもあるのでこれからも調査したいと思います。
> kkkさんがんばってくださいね(^-^)v

ありがとうございます。(^^/

その後調査は続き、
ウニャーさんと同様に、
データ連結をベースに、
DataSourceの使い方とTableとDataSetを使って、
比較的実用的な案を見つけました。

まず、テーブル作成。

Dim TestDataSet As DataSet = New DataSet

Dim Counter As Integer
Dim i As Integer

Dim StringBuffer(100) As Object

For i = 0 To 100
StringBuffer(i) = Str(i) 'Testデータ格納
Next
For Counter = 1 To 100000
StringBuffer(0) = Counter
'DataSetの作成
Dim Rows As DataRow = TestDataSet.Tables("TEST").NewRow()
Rows.ItemArray = StringBuffer

TestDataSet.Tables("TEST").Rows.Add(Rows)
Next

その後、データ連結
DataGrid1.DataSource = DataSet_ZipCode
DataGrid1.DataMember = "TEST"

で、10000×100ぐらいのシートなら、P4 2.6GHz で10秒ぐらいでした。
まだ、速度が十分では無いので、他の方法も模索してみます。

DataBuindingとか、サイズの大きいDBと接続し、
表示する事が出来る様なので、まだ、何かしら方法があるかと思います。
全然、話がぶっ飛ぶんですが、

VC++でスタティックライブラリ(extern Cしなきゃいけませんが)で、
SendMessage(LB_INSERTSTRING)を使って、やったらめちゃくちゃ速くなった記憶が…

郵便番号⇔住所検索(LIKEも可)の時にデータが大量すぎて
(条件を絞りこまない場合は、全件==12万件でる仕様なので)
VBじゃできなかった時に作った記憶があります。

# 私、C出身者でVBで出来ないことをすぐにCに頼ってしまうクセがあります。
# .NET言語じゃなくなるならあまり意味ないかも…
#(C++.NETマネージ拡張でもできるかもしれませんが、Declareで宣言すれば使用可能です)


参考までに、

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <urlmon.h>
#include "Postal.h"
#include "Unlha32.h"

// GetPlaceList
EXPORT void __stdcall GetPlaceList(HWND hWnd, const char szFind[256], const int iSize, const int iStart, const char szFileName[256])
{
    char szNewBuffer[256];
    char szOldBuffer[256];
    char *pFind;
    FILE *fpPostal;

    if (hWnd == NULL) {
        return;
    }

    if ((fpPostal = fopen(szFileName, "r")) == NULL) {
        return;
    }

    SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
    ShowWindow (hWnd, SW_HIDE);
    SendMessage(hWnd, CB_RESETCONTENT, 0, 0);

    while (fgets(szNewBuffer, 256, fpPostal) != NULL) {
        if (memcmp(szFind, &szNewBuffer[8], iSize) == 0) {
            pFind = strchr(&szNewBuffer[iStart], ',');
            *pFind = '\0';

            if (strcmp(&szNewBuffer[iStart], szOldBuffer) != 0) {
                strcpy(szOldBuffer, &szNewBuffer[iStart]);
                SendMessage(hWnd, CB_ADDSTRING, 0, (LPARAM)&szNewBuffer[iStart]);
            }
        }
    }

    ShowWindow (hWnd, SW_SHOW);
    SendMessage(hWnd, WM_SETREDRAW, TRUE, 0);

    fclose(fpPostal);

    return;
}

ただし、一度テキストファイルに落としてやっていないと無意味でしょう。
レコードセットなどを利用してると、追加ロジックでパワーが出ていてもレコードセットからデータを抜き出すところで遅くなる。
テーブルのデータを一旦一気にどっかに落とせれば…あるいは…

# 場を汚してすいません。

DOBON.NET | プログラミング道 | プログラミング掲示板