スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
拍手コメントを見る

午後13時?


乱視がヒドくなったのかと思ったけど、そうじゃなかった。
スポンサーサイト
拍手コメントを見る

雲の切れ間


低気圧は去った…かも?の風景。

しかし今朝は強風だったなぁ。
バルコニーのプランターが暴れてましたぜ。
拍手コメントを見る

どうでも良いけど

蓮舫議員の「舫」って、このケータイだと出てこな~い。
句点コードの7154でやっと出た。 拍手コメントを見る

くったくた



モーフィアスはトリミング。トリニティはワクチンを打つ予定が病院で夏風邪という診断がくだされまして、注射して安静にと。

家についてみたら二頭とも疲れたらしく、すぐに寝てしまい、残ったのは懐かしい静寂。


お父ちゃんとお母ちゃんも疲れたんだけど、チミ達が静かにしてくれることが何よりもの回復剤です。
拍手コメントを見る

初公開!


我が家の3男坊のトリニティです。

俊敏な動きでケータイカメラでは無理だっぺ!

と思った直後一瞬の隙が!

なにはともあれ、以後よろしくお願いします。
拍手コメントを見る

DataView.ToTable() の distinct 指定が遅い

以前のエントリ「.NET DataTable の集計速度を計測してみた」でも書きましたが、DataView.ToTable() メソッドにおける、distinct 指定がパフォーマンス上ボトルネックとなるので、使うとしても場所限定って事になるだろうなと思ってました。

実際のところ、どんだけ遅いんだろ?って事で確認してみたのですが、対象を複数列にすると極端にパフォーマンスが落ちることがわかりました。もはや安心して使えるレベルじゃないなぁと。

オリジナルの DataTable に COL1 ~ COL5 まで列があったとします。
ToTable() メソッドを利用すれば、例えば COL1 を除いた残りのレコードで、重複しないテーブルを生成させる事ができます。
例1)
001 : void Example1()
002 : {
003 : DataTable dtTgt = dtOrg.DefaultView.ToTable(true,
004 : "COL2", "COL3", "COL4", "COL5");
005 : }

対して、for で回して、Rows.Find() で検索してみる方法は次の様なコードです。
例2)
001 : void Example2()
002 : {
003 : DataTable dtTgt = dtOrg.Clone();
004 : dtTgt.PrimaryKey = new DataColumn[]
005 : {
006 : dtTgt.Columns["COL2"], dtTgt.Columns["COL3"],
007 : dtTgt.Columns["COL4"], dtTgt.Columns["COL5"]
008 : };
009 : foreach (DataRow drOrg in dtOrg.Rows)
010 : {
011 : object [] keys = new object []
012 : {
013 : drOrg["COL2"], drOrg["COL3"],
014 : drOrg["COL4"], drOrg["COL5"]
015 : };
016 : DataRow drTgt = dtTgt.Rows.Find(keys);
017 : if (null == drTgt)
018 : dtTgt.Rows.Add(drOrg.ItemArray);
019 : }
020 : dtTgt.Columns.Remove("COL1");
021 : }

どうみても、例1の方がシンプルで速そうな感じなんですが、果たしてその結果は・・・!?

全く重複しないレコードを用意して、確認してみました。
           +--------------------------------+
| 対象件数 |
+-------+-------+-------+--------+
| 100 | 1000 | 10000 | 100000 |
+----------+-------+-------+-------+--------+
| Example1 | 0 | 0.063 | 6.828 | 692.584|
+----------+-------+-------+-------+--------+
| Example2 | 0 | 0.016 | 0.188 | 2.391|
+----------+-------+-------+-------+--------+
※単位:秒


どうでしょうか?
これみて、DataView.ToTable() メソッドを利用したいと全く思わなくなりました。
Example1の場合、10万件で、12分近くかかるってことで、100万行やると、単純計算で19時間もかかりそうなので、実験は中止しました。
ちなみに、Example2 は、28秒掛かりました。

※今回は公平となるように、抽出対象となる列を全て PrimaryKey としましたが、通常、PrimaryKey は1つか2つです。数が少なくなればなるほど、より高速になります。 拍手コメントを見る

テーマ : プログラミング
ジャンル : コンピュータ

マツダ・シナリ

これ、どうよ!?


マツダの「シナリ」というそうな。 拍手コメントを見る

テーマ : コンセプトカー
ジャンル : 車・バイク

クッキリ

東横線の新丸子-多摩川間で富士山がクッキリ。しかし万年雪っていつから無くなってまんねん。
・・・
そして、九段下からは建設途中の東京スカイツリーがこれまたクッキリ。いつもはモヤがかかったような感じなんですが。

今日はいつもより20分早く家を出たから、、かな? 拍手コメントを見る
ブログ内検索
プロフィール

雷ぶ

Author:雷ぶ

最近の記事
最近のコメント
最近のトラックバック
カテゴリー
月間アーカイブ
ブロとも申請フォーム

この人とブロともになる

RSSフィード
リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。