- PR -

VB.VETで、処理速度を早くしたいのですが

投稿者投稿内容
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-02-17 13:00
引用:

くまのぷーさんさんの書き込み (2004-02-17 12:30) より:
...
ご指摘のとおり、問題は3で、確かに大量データを扱っているのですが、不要な部分は出来る限り削除してはいるのですが、出力項目の多さから、なかなか減らすことは難しい状況です。
...


ひょっとして、コンソールアプリでConsole.WriteLineを多用されているとか...
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 2004-02-17 13:18
皆さんいろいろなご指摘ありがとうございます。

ここでまとめて回答させていただきます。

>iStation さん

C/C++のDLLを使うというのは、とても魅力的なアイデアなのですが、私自身はC/C++を使ったことが無くて、開発ソフトも持っていないので、ちょっと敷居が高いと感じるています。

なお、Console.WriteLineは全く使っていません。

>ぢゃん♪さん

元データの読み込み自体は全体の0.2%程度です。

>はにまるさん

確かにSQLに任せられそうな処理もありますが、9割は条件によって調整係数を使ったり、追加したりという計算を行っています。





Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-17 13:21
 万を大幅に越えるデータをエクセルで扱おうとしていたことに、まずは脱帽。。。
引用:

くまのぷーさんさんの書き込み (2003-12-22 13:21) より:

for i=1 to 100
for j = 1 to 12
a(i,j)=a(i,j)+b(1,j)*c(i,J)
next
next


 で、ここの所ですが、「数字」から単純に判断して、「100個の項目を月ごとに、単価×個数で計算」でしょうか。aもbもcもテーブルの中の特定できる列であるなら、SQL Serverの中だけで、UPDATE文でできますけど?または、ストアドプロシージャという方法もあります。単純な集計だけなら、ストアドプロシージャを用いるのが、C++やなんやかんやを使うよりも速いです(たぶんこの場合、データベースとのやり取りがかなりの時間になると思われるので)。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-02-17 13:38
引用:

くまのぷーさんさんの書き込み (2004-02-17 13:18) より:

>iStation さん

C/C++のDLLを使うというのは、とても魅力的なアイデアなのですが、私自身はC/C++を使ったことが無くて、開発ソフトも持っていないので、ちょっと敷居が高いと感じるています。


開発環境がないのですか...残念!VC/C++6.0で良いのですが...
私はかつてVB6.0のユーザーでしたが、紹介した方法で行列計算(Gauss-Jordan)が
数10倍超も速くなった経験がありました。
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 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で書けないか考えてみます。
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 2004-02-17 13:51
>iStationさん

10倍早くなるというのは、大変なことなので、再考させてください。

ただ、本当に素人なので、具体的な利用方法を教えていただきたいのですが

C/C++の開発環境があるとしたら、どういう手順でDLL化して、
VB.NETではどのように利用すればよいのでしょうか。

迷惑な質問なのは承知していますが、よろしくお願いします。

マリテス
会議室デビュー日: 2004/02/14
投稿数: 9
投稿日時: 2004-02-17 14:42
ちょっと確認

>bとcはエクセルのデータ
ということですが、bとcの掛け算を予めエクセル上でしておくことは
出来ないのですか?
掛け算は足し算に比べるとかなり遅いので事前にしておければかなり高速になるはずです。
また、b、cいずれかに0がくる可能性が比較的多ければ0判定をして処理を飛ばした方が高速になりますよ。
状況がわからないのでこれ以上は言えませんが、データの中身を再度考察してみてはいかがですか?
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-02-17 15:03
ども、ほむらです。
------
くまのぷーさん氏へ
引用:

a(i,j)=a(i,j)+b(1,j)*c(i,J)

のaはSQLServer、bとcはエクセルのデータなので、SQLでその処理を書こうという発想は無かったです。b、cをSQLServerに入れて、SQLで書けないか考えてみます。


aはRecordSetだったりしないですよね?
昔、使ってみてわかりましたけどあれに代入すると恐ろしく遅いですよ。

あと、
引用:

20時間というのは、元データ300万件に対しての全体の処理の時間です。
処理時間は元データ数にほぼ比例していて、目標は2,000万件を100時間なので、300万件では15時間です。


件数からしてエクセルで処理できる数じゃないですよね。
bとcは参照するだけ見たいですし。。

Jitta氏も言っていますけど
データベースにbのテーブルとcのテーブルを登録してSQL基本で処理させれば
(サブクエリとあわせて)
結果表示用のテーブルを作る形だけでも
半日もあれば終わるようにできるのではないんですか?
データベースで集計とか追加で300万件くらいなら普通なように思いますし

スキルアップ/キャリアアップ(JOB@IT)