喫茶XRAYトップページ

[スレッド全体
]

[6891] 時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 15:45:11 Syake
貴方は一度に10行のレコードを読み込みますか?
1万行はあるけど10万行は無い?

そんな貴方にお勧めです。
TDBXReaderでデータをLoadしてみませんか。


10万行(DBX)
        FieldByNameで呼出し 約51秒
      Fieldsで呼出し      約43.7秒
1万行(DBX)
        FieldByNameで呼出し 約5.1秒
      Fieldsで呼出し      約4.4秒

これでも早いですか?


10万行(TDBXReader)
        Value['xxxx']で呼出し 約6秒   //フィールド名で呼出し
      Value[X]で呼出し      約3.5秒
1万行(DBX)
        Value['xxxx']で呼出し 約0.6秒    //フィールド名で呼出し
      Value[X]で呼出し      約0.34秒

これでも遅いですか?




[6893] Re: 時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 16:31:04 Mr.XRAY
> 貴方は一度に10行のレコードを読み込みますか?
> 1万行はあるけど10万行は無い?


これは,へぇー,FieldByName が,そうなんてすか.
これは知りませんでした.
といっても,SQL 文での読み込みが多いですが.

ところで,大量のデータで思い出したんですが,
たまに,TDBGrid とか TStringGrid に何10万レコードとか,何10万行を
表示すると時間がかかる,という質問を見るとがあるんですが,

TDBGrid とか TStringGrid に読み込みということは,表示するということです.
表示するということは,そのデータを見るということです.
そんなに大量のデータを表示する必要って,どんな場合なんでしょうね ?

とりあえず表示して,その中にあるのでまた絞るとか ?


[6895] Re2: 時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 17:17:27 Syake
▼ Mr.XRAYさん

1万行(TDBXReader)
        Value['xxxx']で呼出し 約0.6秒    //フィールド名で呼出し
      Value[X]で呼出し      約0.34秒
ですね。(修正)

> そんなに大量のデータを表示する必要って,どんな場合なんでしょうね ?

私はそんな要望は聞いたこと無いし、私的にはやりたいとも思いませんね。

> とりあえず表示して,その中にあるのでまた絞るとか ?

とても意味のあることとは思えませんね。


実際、何万行ものデータを一度にロードする様なシステムって有るんですかね?

まあ既知のシステムで180万行の中から最大8千行を一度に呼出すなんて
事がありました。
それでもねぇ....。




[6896] Re3: 時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 17:33:01 Mr.XRAY
▼ Syakeさん

> 実際、何万行ものデータを一度にロードする様なシステムって有るんですかね?

でも,掲示板等で,ほんとにたまにですがあるんだもん.もん.
メールでの問い合わせでもありましたが..
で,何か方法を考えてはいるのですが.でもねぇ.
8000 行ぐらいはありかも.


[6897] Re4: 時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 19:34:49 Syake
▼ Mr.XRAYさん
> でも,掲示板等で,ほんとにたまにですがあるんだもん.もん.

いずれにしても、アクセス時間で相当の時間がかかると思われますので
根本的解決はアクセスにかかる時間を減らすことだと思います。
TStringGridなら先ほどのTDBXReaderで速度アップは可能かと。
お手軽なTDBGridでも可能ですが、内部処理が二度手間になるので処理時間
は多少長くなるかもしれません。多分。
但し条件としてはdbExpressが使用できる環境で無いとTDBReaderは使用
できませんので、Enterprise以上が必要です。

少なくとも記載した時間分は早くなるかな!?(43秒→4.4秒)

uses
  Data.DB,  Data.SqlExpr, Data.DBXCommon;

procedure XXXXXX.LoadData();
var
  Comm :TDBXCommand;
  Reader :TDBXReader;//前方向専用リーダーです。
begin
  //TSQLConnection(SQLConnection1)貼付け!?済として
  Comm := SQLConnection1.DBXConnection.CreateCommand;
  try
    Comm.Text := 'SELECT文';
    Reader := Comm.ExecuteQuery;
    if Assigned(Reader) then
    begin
   try
    //レコードが空だと最初からループしませんので、レコード有無の判定は不要です.
        //TStringGridへの書込みは以下の処理をどうぞ
    while Reader.Next do
        begin
          {
     フィールドデータを呼出すにはValueを使う。
     Reader.Value[].AsString; 等
     []内はフィールド名か配列値でフィールドを指定
     するが、当然配列値を指定した方が早いです。
     キャストするときInteger型はDataSet時と指定が
     若干異なりますが問題なしです。
     なので、後はDataSetと同じ感覚でどうぞ。
     }
        end;

        //CopyReaderToClientDataSet(Reader,ClientDataSet);
        {このメソッドで、TDBXReaderからClaientDataSetへ
     データを一括して渡す事もできます。
     なので、こちらでTDBGridも使えます。
     もちろん呼出すレコードに比してそのメソッドの
     処理時間はかかりますけど。}
      finally
        Reader.Free;
      end;
    end;
  finally
    Comm.Free;
  end;
end;

これで、とっても早く処理ができます。多分。
但しDB2ではUnicodeが使えません。

[6898] Re5: 時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 20:39:11 Mr.XRAY
▼ Syakeさん,サンクスです.

> var
>   Comm :TDBXCommand;
>   Reader :TDBXReader;//前方向専用リーダーです。


こんなもん知りませんでした.
後で,ここを検索する時のために,高速,速く,テータを読み込むには
と書いておこうっと.
あっ,DEKO さんとこにも書いておうかな.


[6900] 大量のデータの読み込みと表示返信 削除
2013/4/22 (月) 20:50:22 Mr.XRAY
> 後で,ここを検索する時のために,高速,速く,テータを読み込むには

高速,データ表示で思い出したんですが,
テキストの読み込みに時間がかかる,という質問もみたことがあります.
何と,1 GB のテキストファイルというのがありました.
今,検索してみましたが,検索語句が適当でないらしく,見つかりせんが.

TStringList や TStream 関係で読み込んでも,おそらく全てを読み込むことは
できないでしょうね.32 ビットアプリでは.
32 ビットアプリでは,1 プロセスが使えるメモリは 2 GB バイトです.
でも,2 GB バイト全てが使えるわけではありません.
しかも,TStream 関係を使っても,その内部の処理でメモリ使いますから.

これも,個人的には疑問があります.
そんなに大きいテキストファイルを読み込むという必要性です.
世の中,私の知らない要望があるもんです.

実際問題として,データの読み込みよりも,表示用のコントロールに
表示する,描画に時間がかかるのが問題点なのかも知れません.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82