Excelへのデータ貼り付け時のメモリ不足を解消するには?

解決


みき  2007-03-26 11:22:11  No: 135874

はじめまして。みきと申します。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)

方式として間違った方法を取っているのでしょうか?
メモリ不足が出てしまう原因、または他に良い方法などあればご教授ねがいたくおもっています。

よろしくお願いいたします。


みき  2007-03-26 11:37:33  No: 135875

×Vardata(i, k) = ds.Fields(k).Value

○Vardata(i, k) = ds.Fields(k-1).Value

すみません、例に間違いがありました。
お力添えお願いいたします。


特攻隊長まるるう  2007-03-27 22:18:38  No: 135876

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 に
読み込むプログラムは作った事があります。
安定して動いてます。


みき  2007-03-28 21:45:23  No: 135877

特攻隊長まるるうさん、ありがとうございます。

iniファイルから貼付ける行数の指定とSleepの時間指定ができるようにしました。
スペックが違う各種PCで実行しても(無論速度に差異はありましたが)メモリ不足の応答はなく実行が可能となりました。

一度に取得する領域も減ったため、実行速度も実質はやくなりました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加