喫茶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秒

これでも遅いですか?




[6892] 時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 15:46:26 Syake
わしも歳じゃ
表題と名前を差し違えるとは...(;_;)

[6894] Re:時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 16:33:50 Mr.XRAY
> 表題と名前を差し違えるとは...(;_;)

僭越ではありますが,勝手に修正させていただきました(^^;


[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 関係を使っても,その内部の処理でメモリ使いますから.

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

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


[6899] Re:時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 20:41:19 snail3
Syakeさんこんにちは

計測条件をもう少し詳しく教えていただけませんか。

そもそもTDBXReader自体を知らないじいさんですが
時間短縮したいと考えています。

私も色々と試す必要があって少し前に時間を計ってみました。

計測したDBは ORACLE と SQLite です。

10000件リード
SQLite 1回目  4Sec 2回目 10sec ←ローカルマシン
SQLite 1回目 17Sec 2回目 30sec ←ローカルマシンADO
Oracle 1回目 17Sec 2回目110sec ←サーバーADO接続

時間は参考程度で見てください。


計測に利用したSQL文
----------------------
SELECT MHIN_HINCD,MHIN_JITSUCD,MHIN_HINMEI
,MHIN_CLASSSHIWA,MSWA_MEISYOU
,MHIN_CLASSHIN,MHBU_MEISYOU
,MHIN_CLASSTAN,MHIN_TANICD,MHIN_IRISU
,MHIN_TANKA,MHIN_CTANKA,MHIN_CTANKMI,MHIN_CTANFEN,MHIN_CTANKYOU
,MHIN_CTANKRI,MHIN_TANKAGEN,MHIN_TANKAURI,MHIN_TANKAHYOU,MHIN_ZAIKANYN
,MHIN_GENZAIKANYN,MHIN_HACHUTEN,MHIN_HACHUSU,MHIN_HACHU,MHIN_HHINBAN
,MHIN_STANCD,MHIN_RRANK,MHIN_MRANK,MHIN_BIKOU,MHIN_PASS
,MHIN_HAISHIYMD,MHIN_HAISHIYMDK,MHIN_SOZAI,MHIN_IRO,MHIN_SYOUSAI
,MSEI_MNO,MSEI_SERIES,MSEI_KIHONKEI,MSEI_GEN,MSEI_TOUROKU
,MSEI_SHOUNIN,MSEI_HAIFU,MSEI_OVERSEA,MSEI_INTER,MSEI_OEM
,MSEI_MIC,MSEI_NANI1,MSEI_NANI2,MSEI_OMOTEA
,MSEI_DOUSUN,MSEI_SAO,MSEI_BIKOU
,MBD_WU,MBD_WL,MBD_L,MBD_HU,MBD_HL,MBD_HA
,MBD_HS,MBD_BIKOU
,MSB_TYPE,MSB_GEN,MSB_HABA0,MSB_HABA12,MSB_NAGASA
,MSB_ATSUMI,MSB_HABA,MSB_FUKASA,MSB_PITCH,MSB_FSU
,MSB_BIKOU
 FROM MHIN
 LEFT JOIN MSEI ON MHIN_HINCD = MSEI_HINCD
 LEFT JOIN MBD  ON MHIN_HINCD = MBD_HINCD
 LEFT JOIN MSB  ON MHIN_HINCD = MSB_HINCD
 LEFT JOIN MSWA ON MHIN_CLASSSHIWA = MSWA_CLASSSHIWA
 LEFT JOIN MHBU ON MHIN_CLASSHIN = MHBU_CLASSHIN
order by  MHIN_HINCD

実際の取り出しコーディング(SQLite)
----------------------------------
  WrkSQLIteTable.MoveFirst;
  while WrkSQLIteTable.EOF = False do          // UTF8Encode(
  begin
    WrkListItem  := KELV1.LVO.Items.Add;             // ←行追加
    Inc( WrkIdx1 );
    WrkListItem.Caption := IntToStr( WrkIdx1 );      // 行タイトル

    WrkStr := WrkSQLIteTable.FieldAsString[1];// .FieldByName[ 'MHIN_HINCD'];

    WrkStr := WrkSQLIteTable.FieldByName[ 'MHIN_HINCD'];
    WrkListItem.SubItems.Add( WrkStr );         // 1列目に値設定
    WrkStr := UTF8Decode( WrkSQLIteTable.FieldByName[ 'MHBU_MEISYOU'] );
    WrkListItem.SubItems.Add( WrkStr );         // 2列目に値設定
    WrkStr := UTF8Decode( WrkSQLIteTable.FieldByName[ 'MSWA_MEISYOU'] );
    WrkListItem.SubItems.Add( WrkStr );         // 3列目に値設定
    WrkStr := UTF8Decode( WrkSQLIteTable.FieldByName[ 'MHIN_HINMEI'] );
    WrkListItem.SubItems.Add( WrkStr );         // 4列目に値設定

    WrkSQLIteTable.Next;
  end;

ちなみに取り出したデータを ListView にセットしない↓の場合は
SQLite ローカルの場合 0.7秒/1万件でした

  while WrkSQLIteTable.EOF = False do          // UTF8Encode(
  begin
    WrkStr := WrkSQLIteTable.FieldByName[ 'MHIN_HINCD'];
    Inc( WrkIdx1 );
    WrkSQLIteTable.Next;
  end;



[6901] Re2:時間短縮したいとお望みの貴兄に返信 削除
2013/4/22 (月) 21:15:46 snail3
TDBXReader=DBX (dbExpress)ですか?



[6903] Re3:時間短縮したいとお望みの貴兄に返信 削除
2013/4/23 (火) 07:59:43 Syake
▼ snail3さん
> TDBXReader=DBX (dbExpress)ですか?
>

です。

[6905] Re4:時間短縮したいとお望みの貴兄に返信 削除
2013/4/23 (火) 10:18:31 snail3
▼ Syakeさん

> > TDBXReader=DBX (dbExpress)ですか?
> >
> です。


ということは DEKO さん情報によると

>Professional 版の場合、DBX を用いて リモート接続する事は禁止されています。
>接続可能 / 不可能に関らずライセンス上ダメという事です。


なので Professional 版の私は利用できない。(;_;)

[6904] Re3:時間短縮したいとお望みの貴兄に返信 削除
2013/4/23 (火) 08:27:28 Syake
▼ snail3さん

ご承知の通り、ADO接続で大量のレコードを高速に読み込みには
 ・clUseServer,ctOpenForwardOnly,ltReadOnlyの設定で有ること
 ・Fieldが多い場合はFieldByNameでは無くFields(配列値指定)を使う
  (最も視認性は悪くなります)
 クライアント機でも改善に繋がります。

でもADOはdbExpress(SQLDataSet使用)にはかないません。
前方向カーソルだけなので、利便性は悪いですが高速データアクセスは
とっても魅力です。
RDBMSの固有の機能には対応できません。

FireDACは汎用性が高く、幾つかのRDBMS固有の機能にも対応しているよう
です。
ADOやdbExpress(SQLDataSet)よりデータアクセスは早かったです。
ADOやdbExpressに比して利便性もこちらの方が上だと確信します。
BDEの後継になり得るでしょう。多分。
(但しエンタープライスエディションでないと無償になりません)


早さだけで言うならどれもTDBXReaderにはかないません。
Datasnapのお勉強中に見つけました。
知らないことがたくさんあります。(;_;)
まあ、「使えて良いなら何でも」って感じです。




[6916] Re:時間短縮したいとお望みの貴兄に返信 削除
2013/4/25 (木) 20:05:35 Pro版匿名ユーザー
こんにちは。
○○○ーな事情ありで匿名希望、削除可です(笑)


FireDacあたりもTDataset互換がウリらしく、
Pro版単体の存在価値も限りなくゼロに近くなるように読めたりして
書き込ませてください。

たとえば、ODBC API(順方向カーソルのSQLGetData)直書きで、
5列の10万行のSelectでFirebird/SQLite共、軽く3.5秒前後はでます。
(これぐらいの件数ですと、列数とサイズなど属性で変動が大きく、あくまで参考レベルの話)

>10万行(DBX)
>Value[X]で呼出し      約3.5秒


↑確かに速いですが、ODBCもDBMS依存なColbindとかでもう少し高速にもなります。
で、

>Fieldsで呼出し      約43.7秒

↑単に素のDBX(というかTDataset周り)が遅すぎるだけの話のような気がします。

企業向けフレームワークとかの謳い文句はわかるのですが、
この程度で満足なWin限定ユーザーさんは迷いなく、.Net一択でしたし、
クライアント側双方向カーソルでグリッド表示なんかは、
10年前のネットワーク環境向けのような側面もあります。
こんな時代遅れフレームワークで売り惜しみ的ビジネスをするのか理解不能です(涙)

ただ、TDataset互換が邪魔なだけで、DBXドライバ自体は、Mobile含めて使い道ありそうで
Pro版添付など遅ればせながらDelphi製アプリの間口広げる姿勢になった方が、
とっくに淘汰されたIDEビジネスなんかにもプラスだと思うんですけどね。

○○○ー暇なしPro版ユーザーの声でした(笑)


[6918] Re:時間短縮したいとお望みの貴兄に返信 削除
2013/4/25 (木) 20:38:56 Pro版匿名ユーザー
こんにちは。
○○○ーな事情ありで匿名希望、削除可です(笑)


FireDacあたりもTDataset互換がウリらしく、
Pro版単体の存在価値も限りなくゼロに近くなるように読めたりして
書き込ませてください。

たとえば、ODBC API(順方向カーソルのSQLGetData)直書きで、
5列の10万行のSelectでFirebird/SQLite共、軽く3.5秒前後はでます。
(これぐらいの件数ですと、列数とサイズなど属性で変動が大きく、あくまで参考レベルの話)

>10万行(DBX)
>Value[X]で呼出し      約3.5秒


↑確かに速いですが、ODBCもDBMS依存なColbindとかでもう少し高速にもなります。
で、

>Fieldsで呼出し      約43.7秒

↑単に素のDBX(というかTDataset周り)が遅すぎるだけの話のような気がします。

企業向けフレームワークとかの謳い文句はわかるのですが、
この程度で満足なWin限定ユーザーさんは迷いなく、.Net一択でしたし、
クライアント側双方向カーソルでグリッド表示なんかは、
10年前のネットワーク環境向けのような側面もあります。
こんな時代遅れフレームワークで売り惜しみ的ビジネスをするのか理解不能です(涙)

ただ、TDataset互換が邪魔なだけで、DBXドライバ自体は、Mobile含めて使い道ありそうで
Pro版添付など遅ればせながらDelphi製アプリの間口広げる姿勢になった方が、
とっくに淘汰されたIDEビジネスなんかにもプラスだと思うんですけどね。

○○○ー暇なしPro版ユーザーの声でした(笑)


[6919] Re2:時間短縮したいとお望みの貴兄に返信 削除
2013/4/25 (木) 20:50:24 Pro版匿名ユーザー
すみません、削除パスワード入力を忘れました。
削除お願いします。

[6923] 悲しくて涙がでます返信 削除
2013/4/26 (金) 12:25:21 Mr.XRAY
人が嫌がることを「意識的」に平気でやる人間に,
物事,世の中全てのことについて,何かを語る資格はありません.

戦争も,テロも,イジメも,暴力も,スパムも,
コンピュータウィルスも,強盗殺人も,セクハラも,冤罪も,原発事故も,
永遠に不滅だということを改めて認識させていただきました.


[6924] Re:悲しくて涙がでます返信 削除
2013/4/26 (金) 14:01:37 Mr.XRAY
先ごろ,俳優の三国連太郎さんがなくりなました.
萬屋錦之助(中村錦之助) 主演の宮本武蔵で,沢庵和尚の役で出演していました.

千年杉に吊るされた武蔵(タケゾウ)が暴れているのを見上げて,
こんなことを言いました.
(本を見て書いているのではないので正確ではありません)

≪タケゾウ,まだ生きておるか.元気じゃのう.その元気なら当分は死なんのう.
惜しいのうタケゾウ,
お主,折角人として生まれながら,あたら紅顔ここに散るか,
実に惜しい.それだけの力,天下国家のためとは言わん,
せめて人のために使こうてみい.天地はおろか,神をも動く!!≫

こんなことを思い出しました.


[6925] Re2:悲しくて涙がでます返信 削除
2013/4/26 (金) 20:37:47 yoshida
失礼しました。
事情アリな飲み屋のおねえちゃんとついつい行きつけの店に入ってしまい
一見客を装うしかない小心庶民的な感覚で書き込んでしまいました(悲)


▼ Mr.XRAYさん(というか沢庵和尚さん?)

>天地はおろか,神をも動く!!

小心庶民としては、まっとうな製品価格に動いてほしいだけです。
他意はありませんです。


INCM/CMT
Cyclamen v3.82