- 締切済み
書き出し処理速度について
バイナリデータを読み込み、数値データに変換、テキストファイルにタブ区切りで書き出すプログラムをvba/excelにて作成中ですが、書き出し処理速度の遅さに困惑しております。数値データに変換した配列はDATA(256,120000)としており、書き出しデータ数は約3,000,000個あります。その書き出しプログラムを下記のように記述したのですが、とんでもなく処理速度がおそいのです。 Open "c:\test.txt" For Output As #2 For i = 1 To 120000 For j = 1 To 256 Print #2, DATA(j, i); Chr(9); Next j Print #2, Chr(10); Next i Close #2 対処方法をご存知でしたら、ご教授願います。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- noocyte
- ベストアンサー率58% (171/291)
> 書き出しデータ数は約3,000,000個 3百万じゃなくて3千万ですね. データ型がわかりませんが,1個4バイトだとすると約117MBです. それだけ巨大なメモリを使っていると, ページングが多発して非常に遅くなると思います. 変換を行うのに全データを調べる必要があるのなら仕方ありませんが, 単にバイナリファイルの中の一つ一つのデータを個別に変換するだけでよいのなら, #2 さんも書いておられるように次のようにする方が速くなると思います. (1) 巨大な配列ではなく,小さなバッファを用意する.例えば DATA(256). (2) バイナリファイルを先頭から順にバッファに読み込み, 一杯になったらテキストファイルに書き出す. (3) (2) を必要回数繰り返す. VB は知らないのでサンプルを示せません.あしからず.
- KenKen_SP
- ベストアンサー率62% (785/1258)
バイナリは配列に読み込んで、配列上で加工してるんですよね? んー > DATA(256,120000) 0 オリジンだと縦横の要素数が 行257×列120001 となって Excel VBA では非常に違和感があるんですけども。。。 256 バイトずつ 120000 回バッファしたなら、1 オリジンで考えると Data(1 To 120000, 1 TO 256) となりそうな気がします。。。まあ、いずれにせよ、 Range("A1:IV12000").Value = Data といったコードで一度データをセルに一括転記し、 ActiveWorkbook.SaveAs Filename:="C:\test.txt", _ FileFormat:=xlText として、Excel のタブ区切りテキスト形式で保存します。データ の加工が既に完了しているなら、書き出し処理を自前でするより、 Excel の機能を利用した方が高速処理できますよ。 でも、このような処理は、本来データを一括オンメモリにしないで、 メモリを圧迫しない程度の最大バッファサイズを決めておき、 読み込み-->データ加工-->出力 を小刻みに繰り返すのが定石だと思いますが。
- tkrn
- ベストアンサー率53% (33/62)
回答ではありませんが、アドバイスさせて頂きます。 このポイントで処理速度を上げるのは難しいかもしれません。 ファイルの書き出しの負荷以前に、ループ処理とキャストの負荷が高そうです。 取り込む時に、事前に数値データとして扱わずに文字列として取り込む操作はできませんか? また、2次元配列を使わずに1次元配列で操作できませんか? 1次元配列かつ文字列として操作可能あれば、ループ処理を極力減らしてコーディングすることが可能かもしれません。 ヒントコードとしては、下記のような感じで文字列操作として処理が事前(読込み時とかに)できれば改善できそうですが… Dim VALUE(256) As String '値の配列(1行) Dim ROW(120000) As String '行の配列 : '値と値の間にChr(9)をセットし結合 ROW(i)= Join(VALUE, Chr(9)) : '行と行の間にChr(10)をセットし結合 strAll = Join(ROW, Chr(10))