ReDim Preserve 〜 で 「メモリが不足しています。」

解決


kazz  2006-11-27 20:46:39  No: 97264

ReDim Preserve 〜  の行で  「メモリが不足しています。」のエラーが発生しました。因みにエラー時の要素数は約35,000〜40,000位です。
そこで試しに、Dim文にて  100000 固定で宣言したらエラーはでませんでした。どういった理由が考えられますか?
勿論極力  ReDim Preserve 〜を利用したいと思っています。
何卒ご教授願います。


大吉末吉  2006-11-27 21:25:24  No: 97265

> ReDim Preserve 〜  の行で  「メモリが不足しています。」のエラーが発生しました。
> 因みにエラー時の要素数は約35,000〜40,000位です。

データ型は何です?次元数は1次元ですか?

> Dim文にて  100000 固定で宣言したらエラーはでませんでした
この代わりに(Dimを宣言した位置に)「ReDim Preserve 」で40,000を指定してもエラーになりますか?


kazz  2006-11-27 22:37:13  No: 97266

大吉末吉様
早速のレスありがとうございます。

データ型はstring で2次元配列です。

Dimを宣言した位置に「ReDim Preserve 」で100,000を指定してしても
エラーにはならず正常終了しました。


大吉末吉  2006-11-27 22:51:01  No: 97267

> Dimを宣言した位置に「ReDim Preserve 」で100,000を指定してしても
> データ型はstring で2次元配列です。

2次元配列なんですよね?

各次元の、具体的な数はいくつなんです?(片方は100,000ですよね?もう片方は?)

それから、実際に必要なメモリ量は計算してみましたか?

(必要なメモリ量はVBのヘルプ(MSDNライブラリ)の「データ型の概要」を参照してください)

例えば、
・文字列型 (String) (可変長) 10 バイト + 文字列の長さ 
・配列、20 バイトのメモリ、各配列の次元ごとに 4 バイト、およびデータそのものが占めるバイト数を合計したメモリが必要
です。

計算すると、いくつになります?

#Preserveの場合、一時的に、「ReDim前のメモリ量」と「ReDim後のメモリ量」の両方が必要になりそうですが・・・


kazz  2006-11-27 23:11:03  No: 97268

>各次元の、具体的な数はいくつなんです?(片方は100,000ですよね?もう片方は?)
もう片方は2です。
つまり  ReDim Preserve strOutLine(2, 100000) とコーディングしました。
(今回のデータでは66000あればOKです)

必要なメモリは多めに見積もって200Mバイトです。

タスクマネージャーで観察すると、max 120Mバイト位でエラーになっているみたいです。まだ余裕がある筈なんですが…


大吉末吉  2006-11-28 00:04:30  No: 97269

とりあえず、
----------------------------------------------------------
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単位とかで増やすとか・・・)ぐらいしか思いつきません・・・


kazz  2006-11-28 01:40:06  No: 97270

大吉末吉様

レスありがとうございます。
こちらで、もう少し調査してみます。
何か分かりましたら、またよろしくお願いします。
いろいろありがとうございました。


Hongliang  URL  2006-11-28 02:27:45  No: 97271

動的に要素を追加する必要があるなら、配列ではなくコレクションを使うことをお勧めします。
// VB6 まででもあるはずだけど詳しくない。


kazz  2006-11-28 19:28:17  No: 97272

Hongliang様、レスありがとうございます。
VB6にもコレクションはありますね。
(つか本PGの別処理で使用しています。(^^; )
今後参考にさせて頂きます。
今回は大吉末吉様の案(10000単位で増やす)を採用
させていただく事で解決しました。
皆様、本当にありがとうございました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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