はじめまして。みきと申します。VB歴は3週間です。
まずは開発環境ですが、以下となります。
VB6.0 SP5
WindowsXP Proffesional SP2
Excel 2000
Oracle9i (接続 oo4o)
作成しているプログラムの内容は
1.Excelからのデータ抜き出し
2.DBへ登録(10万件程度)
3.プロシージャ呼び出し(DBdataを加工して別テーブルへ入れる)
4.テーブルデータ(カラム数24)をすべてExcelに貼り付け、表示する(10万件程度)
ここで問題になるのは項番4で、テーブルデータを貼り付けるときにメモリ不足というエラーが出てしまいます。
入力補助がきくエディタがここにはないので、多少間違っている可能性はありますが、以下のようなソースになっています。(本来65536行毎にシートの切り替え作業等あるのですが、ここではds.RecordCountが65536だった場合とします)
ds As OraDynaset *引数
Vardata As Variant
Vardata = xlSheet.Range("A1:X65536") 'ここでメモリ不足が発生することが多い
for i = 1 To ds.RecordCount
for k = 1 to ds.Fields.Count
Vardata(i, k) = ds.Fields(k).Value
Next k
ds.MoveNext
Next i
xlSheet.Range("A1:X65536") = Vardata(i, k)
方式として間違った方法を取っているのでしょうか?
メモリ不足が出てしまう原因、または他に良い方法などあればご教授ねがいたくおもっています。
よろしくお願いいたします。
×Vardata(i, k) = ds.Fields(k).Value
○Vardata(i, k) = ds.Fields(k-1).Value
すみません、例に間違いがありました。
お力添えお願いいたします。
VB自体に、メモリ管理が下手なんじゃないか?と感じる点が
幾つかあります。
Excel ってのも多機能な分、重たくて、様子を見ながら
処理してやらないと、すぐにいっぱいいっぱいになってしまう
アプリだと思ってます。
このため、大量のデータを扱う場合は、色々とテストして、
安定する手段を模索する必要があるでしょう。
>方式として間違った方法を取っているのでしょうか?
>メモリ不足が出てしまう原因、または他に良い方法などあればご教授ねがいたくおもっています。
通常、想定されているような操作でない場合、(Excel で
10万行のデータを一気に入力するのは、ある意味異常な状態
だと思います)その処理自体が間違いだと言えなくもない
のでは?
Excel を使わないという選択から考えた方がいいと思います。
とはいえ、ボク自身、[Excel VBA]のみで大量のデータの解析
ツールをつくるような仕事も受けたことありますので。。。
ボトルネックがVB側か?Excel側か?で対策が異なるんだけど、
VB側だと
>Vardata As Variant
を関数の外に出して、使いまわす。。。と何か変わるかもしれない(保証なし)
しかし、今回のソースを見る限り、Excel側だと予想して。。。
A1:X65536 を1回でやらずに分けて実行した方が良いかもね。
速度をとことん追求するなら、何行までなら安定して処理
できるか?を調べて数(百?千?)行ずつ処理してみてください。
ただ、ギリギリの条件だと、実行環境にも左右されると思います。
速度をある程度犠牲にしても良いなら、1行ずつ65536回処理してみて
ください。CPU使用率がはね上がると思いますので、タスクマネージャ
で確認しながら、適度(1000行ごととか)に Sleep するとか対策も
必要になると思います。
データベースの処理は無かったですが、CSVファイルから
テキストデータで100万行のデータを10分掛けて Excel に
読み込むプログラムは作った事があります。
安定して動いてます。
特攻隊長まるるうさん、ありがとうございます。
iniファイルから貼付ける行数の指定とSleepの時間指定ができるようにしました。
スペックが違う各種PCで実行しても(無論速度に差異はありましたが)メモリ不足の応答はなく実行が可能となりました。
一度に取得する領域も減ったため、実行速度も実質はやくなりました。
ツイート | ![]() |