- - PR -
VB.VETで、処理速度を早くしたいのですが
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-17 13:00
ひょっとして、コンソールアプリでConsole.WriteLineを多用されているとか... | ||||||||
|
投稿日時: 2004-02-17 13:18
皆さんいろいろなご指摘ありがとうございます。
ここでまとめて回答させていただきます。 >iStation さん C/C++のDLLを使うというのは、とても魅力的なアイデアなのですが、私自身はC/C++を使ったことが無くて、開発ソフトも持っていないので、ちょっと敷居が高いと感じるています。 なお、Console.WriteLineは全く使っていません。 >ぢゃん♪さん 元データの読み込み自体は全体の0.2%程度です。 >はにまるさん 確かにSQLに任せられそうな処理もありますが、9割は条件によって調整係数を使ったり、追加したりという計算を行っています。 | ||||||||
|
投稿日時: 2004-02-17 13:21
万を大幅に越えるデータをエクセルで扱おうとしていたことに、まずは脱帽。。。
で、ここの所ですが、「数字」から単純に判断して、「100個の項目を月ごとに、単価×個数で計算」でしょうか。aもbもcもテーブルの中の特定できる列であるなら、SQL Serverの中だけで、UPDATE文でできますけど?または、ストアドプロシージャという方法もあります。単純な集計だけなら、ストアドプロシージャを用いるのが、C++やなんやかんやを使うよりも速いです(たぶんこの場合、データベースとのやり取りがかなりの時間になると思われるので)。 | ||||||||
|
投稿日時: 2004-02-17 13:38
開発環境がないのですか...残念!VC/C++6.0で良いのですが... 私はかつてVB6.0のユーザーでしたが、紹介した方法で行列計算(Gauss-Jordan)が 数10倍超も速くなった経験がありました。 | ||||||||
|
投稿日時: 2004-02-17 13:39
>Jittaさん
自分でもかなり無謀なことは承知していますが、PCの性能の向上がそれを可能にしてしまったことによる悲劇というか・・・ a(i,j)=a(i,j)+b(1,j)*c(i,J) のaはSQLServer、bとcはエクセルのデータなので、SQLでその処理を書こうという発想は無かったです。b、cをSQLServerに入れて、SQLで書けないか考えてみます。 | ||||||||
|
投稿日時: 2004-02-17 13:51
>iStationさん
10倍早くなるというのは、大変なことなので、再考させてください。 ただ、本当に素人なので、具体的な利用方法を教えていただきたいのですが C/C++の開発環境があるとしたら、どういう手順でDLL化して、 VB.NETではどのように利用すればよいのでしょうか。 迷惑な質問なのは承知していますが、よろしくお願いします。 | ||||||||
|
投稿日時: 2004-02-17 14:42
ちょっと確認
>bとcはエクセルのデータ ということですが、bとcの掛け算を予めエクセル上でしておくことは 出来ないのですか? 掛け算は足し算に比べるとかなり遅いので事前にしておければかなり高速になるはずです。 また、b、cいずれかに0がくる可能性が比較的多ければ0判定をして処理を飛ばした方が高速になりますよ。 状況がわからないのでこれ以上は言えませんが、データの中身を再度考察してみてはいかがですか? | ||||||||
|
投稿日時: 2004-02-17 15:03
ども、ほむらです。
------ くまのぷーさん氏へ
aはRecordSetだったりしないですよね? 昔、使ってみてわかりましたけどあれに代入すると恐ろしく遅いですよ。 あと、
件数からしてエクセルで処理できる数じゃないですよね。 bとcは参照するだけ見たいですし。。 Jitta氏も言っていますけど データベースにbのテーブルとcのテーブルを登録してSQL基本で処理させれば (サブクエリとあわせて) 結果表示用のテーブルを作る形だけでも 半日もあれば終わるようにできるのではないんですか? データベースで集計とか追加で300万件くらいなら普通なように思いますし |