• ベストアンサー

配列の初期化に時間がかかります・・。

グローバルで宣言した構造体の配列に 2万件ほどの情報をかくのうしました。 あるタイミングでその情報をクリアしたいのですが ものすごく時間がかかります。  Redim AAA(0) でクリアしても時間かかるし(300秒)  Erase AAA でもかなりの時間がかかります。(350秒) これ以外に配列の初期化方法をご存知でしたら 教えてくださいよろしくお願いします。  

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

ある程度の法則を持ってもよいのなら、APIがあります。ZeroMemoryです。 VBのString型は文字列の長さによってバイト数が変化するため、あらかじめバイト数を指定しておかないといけません。 もしそれを指定しないと、ひとつひとつの配列のサイズがバラバラのため、きちんと開放されなかったり、必要なメモリ領域まで開放するおそれがあります。もしVariantなどが含んでいるならばこれは使わないほうが良いかと思います。 サンプルでは Byte = 1バイト Integer = 2バイト Long = 4バイト String = 文字長によって可変。サンプルでは100バイト なので、配列は107×256バイトの領域を使用しているのがわかります。 ---------------これよりサンプル--------------- 'テスト用の適当な構造体 Private Type typetype   bytTest As Byte   intTest As Integer   lngTest As String   strTest As String * 100 End Type '初期化するAPI 第一パラ:構造体の先頭ポインタ/第二パラ:サイズ Private Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" (ByVal Destination As Long, ByVal Length As Long) '構造体の配列数 Private Const DEF_ARY_SIZE As Long = 256 Private Sub Command1_Click()   Dim testTest(DEF_ARY_SIZE - 1) As typetype   Dim i  As Long      '適当な値を設定   For i = LBound(testTest) To UBound(testTest)     With testTest(i)       .bytTest = i       .intTest = i * 10       .lngTest = i * 100       .strTest = Chr(i)     End With   Next i   '構造体の初期化   Call ZeroMemory(ByVal VarPtr(testTest(0)), Len(testTest(0)) * DEF_ARY_SIZE) End Sub

kukkychan
質問者

お礼

ありがとうございます(^_^) 丁寧なサンプル付で。 参考にさせていただきますm(__)m

その他の回答 (3)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

構造体配列の初期化はErase, Redim以外の方法はないと思います。 メモリの余裕はあるのでしょうか? タスクマネージャ等で観察して下さい。 足りなければメモリを増設するべきでしょう。 可変長文字列を使っているなら固定長文字列にした方がいい気がします。 マシンスペックと構造体の定義が分かれば、他に案が出るかも

kukkychan
質問者

お礼

ありがとうございます。 やっぱり初期化はErase, Redim以外の方法はないですか・・・。

  • kagep
  • ベストアンサー率23% (171/721)
回答No.2

あ~、そのくらいのデータ数の配列だと「致し方なし」というところですねぇ。。。 あとはクラスモジュールつかって、コレクション化するとかかな。 それならクリア時にはクラスのインスタンスを破棄するだけだから、 それほど時間かからないかも。

kukkychan
質問者

お礼

ありがとうございます。 知識が足りずにどうしたらいいか わかりません(><)

  • First_Noel
  • ベストアンサー率31% (508/1597)
回答No.1

一度確保したメモリを解放して,メモリアロケーションで再確保してはいかがでしょうか.

kukkychan
質問者

お礼

ありがとうございます。 メモリの解放ですが Eraseを使用する以外の方法で時間がかからない方法が 有れば教えてほしいのですが。 Eraseだとものすごく時間がかかります。 解放自体に時間がかかってしまい、困っています(T_T) よろしくお願いします。

関連するQ&A