- ベストアンサー
配列の初期化に時間がかかります・・。
グローバルで宣言した構造体の配列に 2万件ほどの情報をかくのうしました。 あるタイミングでその情報をクリアしたいのですが ものすごく時間がかかります。 Redim AAA(0) でクリアしても時間かかるし(300秒) Erase AAA でもかなりの時間がかかります。(350秒) これ以外に配列の初期化方法をご存知でしたら 教えてくださいよろしくお願いします。
- みんなの回答 (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
その他の回答 (3)
- todo36
- ベストアンサー率58% (728/1234)
構造体配列の初期化はErase, Redim以外の方法はないと思います。 メモリの余裕はあるのでしょうか? タスクマネージャ等で観察して下さい。 足りなければメモリを増設するべきでしょう。 可変長文字列を使っているなら固定長文字列にした方がいい気がします。 マシンスペックと構造体の定義が分かれば、他に案が出るかも
お礼
ありがとうございます。 やっぱり初期化はErase, Redim以外の方法はないですか・・・。
- kagep
- ベストアンサー率23% (171/721)
あ~、そのくらいのデータ数の配列だと「致し方なし」というところですねぇ。。。 あとはクラスモジュールつかって、コレクション化するとかかな。 それならクリア時にはクラスのインスタンスを破棄するだけだから、 それほど時間かからないかも。
お礼
ありがとうございます。 知識が足りずにどうしたらいいか わかりません(><)
- First_Noel
- ベストアンサー率31% (508/1597)
一度確保したメモリを解放して,メモリアロケーションで再確保してはいかがでしょうか.
お礼
ありがとうございます。 メモリの解放ですが Eraseを使用する以外の方法で時間がかからない方法が 有れば教えてほしいのですが。 Eraseだとものすごく時間がかかります。 解放自体に時間がかかってしまい、困っています(T_T) よろしくお願いします。
お礼
ありがとうございます(^_^) 丁寧なサンプル付で。 参考にさせていただきますm(__)m