いつもお世話になります。
ASP(VBScript)で教えて頂きたいことがあります。
VBScriptにはJavaでいうArrayListのようなコレクション機能がないので、動的配列を実現するためには
ReDim PreserveやScripting.Dictionaryを使用しなければなりませんよね。
そこで、DBから取得したレコードを、ループする度毎にReDim Preserveを使用し、データをセットするよう
な実装をしていました。すると、ReDim Preserveは問題があるのでやめた方がよい、と言われました。
具体的には、ReDim Preserveをすることによって、新たに配列を作成し、古い内容をコピーするため、
倍々にメモリを食いつぶしていくことになり、それが大きくなるとどんどん遅くなっていき、そしてメモリリーク
になる、ということでした。
自分なりに調べてみたのですが、そのような記事を見つけることができませんでしたし、JavaのArrayList
でも内部的には配列を持っており、配列の再作成などをやっています。
○○百万件などといった大量件数を扱う際は、それはメモリリークにならないような設計、実装をしなければ
ならないとは思うのですが、それはどの言語でも共通で言えることであって、特別にVBScriptではやめた方がよい、
とは思えません。
ReDim Preserveを使用しても、先に述べたような認識をもっていれば問題ないと思うのですが、どうでしょうか。
VBScriptは、こういう仕組みだから駄目なんだ、という理由があるのでしょうか。もしあれば、根拠となる
サイトなど教えて頂けると嬉しいのですが。。。
宜しくお願い致します。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
VBScriptのReDim Preserve(懐かしい)に限らず、静的配列の確保というのは、非常にコストのかかる処理で、それをループで連続実行することは何にせよ良くありません。
また、コレクション系の変数は、静的変数と違って、ポインタを用いた可変データストアが可能なため、アクセス速度やメモリ効率は劣るにせよ、データ量が可変する配列を収めるには必須のものだと思います。
JavaのArrayListが、内部的に静的配列で処理されているというのは初耳です。
そのようなことはあり得ないと思いますが、ご質問の趣旨からは外れますので、あえて突っ込みません。
「コレクションやジェネリックが完璧に使えるASP.NETでなく、何で今さらASP?」という素朴な疑問はありますが、どうしてもASP/VBScriptでReDim Preserveを使うのであれば、いったんDBから件数を取得して、その配列を確保してから処理を行うべきです。
また、Webでは大量の配列をハンドリングすることはなく、ページング処理でデータを部分取得しますが、そのような場合でも、ループ中で静的配列の確保をを繰り返してはいけません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
- Visual Basic(VBA) userformでSheetを選択して開くコード 1 2023/05/15 16:27
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- 数学 『数学的帰納法のトリセツ』 4 2022/06/06 07:34
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
VB.NETの配列にExcelから読み込...
-
エクセルでXY座標に並べられた...
-
Excel2010のinputboxで複数デー...
-
Dir関数で読み取り順を操作でき...
-
free()関数の多用 と Segment...
-
Redim とEraseの違いは?
-
2次元配列のソート
-
excel vbaの配列なんですが・・・
-
配列入れ替えの効率的方法は
-
ポーカーを作りたいのですが・・・
-
エクセル(VBA)の空白配列の削除...
-
C#,繰り返し処理での最大値の取...
-
VBAでMODE関数をつくる
-
VB6からの移行したいけど、VB.N...
-
VBAで配列引数を値渡しできない...
-
MATLABを使ったSTLデータのボク...
-
配列の中の最大値とそのインデ...
-
大量の変数を定義するにはどう...
-
2次元配列でウォッチが出来ない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Excel2010のinputboxで複数デー...
-
エクセルでXY座標に並べられた...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
OutOfMemoryExceptionの回避策...
-
Dir関数で読み取り順を操作でき...
-
CheckBoxの配列化
-
構造体配列内の文字列検索のよ...
-
COBOLの基本的な事なので...
-
Redim とEraseの違いは?
-
VBAで配列引数を値渡しできない...
-
2次元配列の初期値
-
配列の中の最大値とそのインデ...
-
大量の変数を定義するにはどう...
-
VB6からの移行したいけど、VB.N...
-
VB6のメモリ解放に関して
おすすめ情報