投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/12/12 20:07:20
> Redim Preserveにて行数を増やし読み込んでいく処理をしています。
ReDim Preserve は、処理としては、比較的『遅い』処理命令となります。

これは、呼び出すたびに、「メモリの確保と破棄」「新旧配列のコピー」がその都度発生するためです。
データ件数が数百件程度ならばさほど問題にはなりませんが、
データ件数が多くなると、処理時間が加速度的に増加していき、
そのうち、現実的なパフォーマンスを得られなくなってしまうでしょう。

ReDim Preserve は、配列の要素数を直接拡縮する命令ではなく、内部的には
 (1) 元の配列とは別に、新しいサイズの別の配列をもう一つ用意する
 (2) 元の配列の要素を、新しい配列にコピーしていく
 (3) 古い方の配列を解放する
 (4) 元の変数が新しい配列を参照するように書き換える
という手続きを行っているためです。


ひとまず対策としては:

(A案) 配列ではなくコレクションを使うようにする
(B案) ReDim の回数をできるだけ減らす。

B案については、たとえば確保していた要素数が足りなくなって要素を増やす場合は、
1 件ずつ増加させるのではなく、3千件などといった大きなブロックで一気に確保し、
ReDim Preserve の呼び出し回数を抑えるようにします。

大きく確保すると、列挙が終わった後で末尾に未使用領域が残るので、最後に
ループ完了後に使わなかった分を Preserve で減らすのが良いでしょう。



> ADODBを用いて、txtファイルに30万行前
ADODB ということは VB.NET ではなく、
VBA / VBScript / VB6 などの言語でしょうか?


もしも VB.NET から ADODB を利用されているのだとしたら、メモリ解放の手間が
著しく面倒なので、できるだけ避けた方が良いでしょう。ADO.NET への切り替えをお奨めします。

KB321415:高負荷下で ADO を .NET COM interop または Java で使用するとアクセス違反が発生する
https://bit.ly/3hpBWIu