ReDim Preserve 〜 の行で 「メモリが不足しています。」のエラーが発生しました。因みにエラー時の要素数は約35,000〜40,000位です。
そこで試しに、Dim文にて 100000 固定で宣言したらエラーはでませんでした。どういった理由が考えられますか?
勿論極力 ReDim Preserve 〜を利用したいと思っています。
何卒ご教授願います。
> ReDim Preserve 〜 の行で 「メモリが不足しています。」のエラーが発生しました。
> 因みにエラー時の要素数は約35,000〜40,000位です。
データ型は何です?次元数は1次元ですか?
> Dim文にて 100000 固定で宣言したらエラーはでませんでした
この代わりに(Dimを宣言した位置に)「ReDim Preserve 」で40,000を指定してもエラーになりますか?
大吉末吉様
早速のレスありがとうございます。
データ型はstring で2次元配列です。
Dimを宣言した位置に「ReDim Preserve 」で100,000を指定してしても
エラーにはならず正常終了しました。
> Dimを宣言した位置に「ReDim Preserve 」で100,000を指定してしても
> データ型はstring で2次元配列です。
2次元配列なんですよね?
各次元の、具体的な数はいくつなんです?(片方は100,000ですよね?もう片方は?)
それから、実際に必要なメモリ量は計算してみましたか?
(必要なメモリ量はVBのヘルプ(MSDNライブラリ)の「データ型の概要」を参照してください)
例えば、
・文字列型 (String) (可変長) 10 バイト + 文字列の長さ
・配列、20 バイトのメモリ、各配列の次元ごとに 4 バイト、およびデータそのものが占めるバイト数を合計したメモリが必要
です。
計算すると、いくつになります?
#Preserveの場合、一時的に、「ReDim前のメモリ量」と「ReDim後のメモリ量」の両方が必要になりそうですが・・・
>各次元の、具体的な数はいくつなんです?(片方は100,000ですよね?もう片方は?)
もう片方は2です。
つまり ReDim Preserve strOutLine(2, 100000) とコーディングしました。
(今回のデータでは66000あればOKです)
必要なメモリは多めに見積もって200Mバイトです。
タスクマネージャーで観察すると、max 120Mバイト位でエラーになっているみたいです。まだ余裕がある筈なんですが…
とりあえず、
----------------------------------------------------------
Dim strOutLine() As String
Dim c As Long
Private Sub Command1_Click()
Dim i As Long, j As Long
c = 100000
ReDim Preserve strOutLine(2, c) As String
'
For i = 0 To 2
For j = 0 To 100000
strOutLine(i, j) = Space(1000)
Next
Next
End Sub
Private Sub Command2_Click()
Dim i As Long
c = c + 1
ReDim Preserve strOutLine(2, c) As String
For i = 0 To 2
strOutLine(i, c) = Space(1000)
Next
End Sub
---------------------------------------------------------------
こんなプログラムで試してみましたが・・・問題なく動きますね・・・
#ちなみに、タスクマネージャで表示される最大メモリ使用量は約600M
> タスクマネージャーで観察すると、max 120Mバイト位でエラーになっているみたいです
ただ、何回も、繰り返していると、メモリ不足が発生するようです。
ひょっとして、メモリの断片化(でしたっけ?)が発生して、連続したメモリが確保できなくなったとか・・・
となると、対処方法は分からないですね。
#ReDim回数を極力減らす(1増える毎にReDimするのではなく、10000単位とかで増やすとか・・・)ぐらいしか思いつきません・・・
大吉末吉様
レスありがとうございます。
こちらで、もう少し調査してみます。
何か分かりましたら、またよろしくお願いします。
いろいろありがとうございました。
動的に要素を追加する必要があるなら、配列ではなくコレクションを使うことをお勧めします。
// VB6 まででもあるはずだけど詳しくない。
Hongliang様、レスありがとうございます。
VB6にもコレクションはありますね。
(つか本PGの別処理で使用しています。(^^; )
今後参考にさせて頂きます。
今回は大吉末吉様の案(10000単位で増やす)を採用
させていただく事で解決しました。
皆様、本当にありがとうございました。
ツイート | ![]() |