- 締切済み
ASPのReDim Preserveについて
いつもお世話になります。 ASP(VBScript)で教えて頂きたいことがあります。 VBScriptにはJavaでいうArrayListのようなコレクション機能がないので、動的配列を実現するためには ReDim PreserveやScripting.Dictionaryを使用しなければなりませんよね。 そこで、DBから取得したレコードを、ループする度毎にReDim Preserveを使用し、データをセットするよう な実装をしていました。すると、ReDim Preserveは問題があるのでやめた方がよい、と言われました。 具体的には、ReDim Preserveをすることによって、新たに配列を作成し、古い内容をコピーするため、 倍々にメモリを食いつぶしていくことになり、それが大きくなるとどんどん遅くなっていき、そしてメモリリーク になる、ということでした。 自分なりに調べてみたのですが、そのような記事を見つけることができませんでしたし、JavaのArrayList でも内部的には配列を持っており、配列の再作成などをやっています。 ○○百万件などといった大量件数を扱う際は、それはメモリリークにならないような設計、実装をしなければ ならないとは思うのですが、それはどの言語でも共通で言えることであって、特別にVBScriptではやめた方がよい、 とは思えません。 ReDim Preserveを使用しても、先に述べたような認識をもっていれば問題ないと思うのですが、どうでしょうか。 VBScriptは、こういう仕組みだから駄目なんだ、という理由があるのでしょうか。もしあれば、根拠となる サイトなど教えて頂けると嬉しいのですが。。。 宜しくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- shockatz
- ベストアンサー率80% (153/191)
VBScriptのReDim Preserve(懐かしい)に限らず、静的配列の確保というのは、非常にコストのかかる処理で、それをループで連続実行することは何にせよ良くありません。 また、コレクション系の変数は、静的変数と違って、ポインタを用いた可変データストアが可能なため、アクセス速度やメモリ効率は劣るにせよ、データ量が可変する配列を収めるには必須のものだと思います。 JavaのArrayListが、内部的に静的配列で処理されているというのは初耳です。 そのようなことはあり得ないと思いますが、ご質問の趣旨からは外れますので、あえて突っ込みません。 「コレクションやジェネリックが完璧に使えるASP.NETでなく、何で今さらASP?」という素朴な疑問はありますが、どうしてもASP/VBScriptでReDim Preserveを使うのであれば、いったんDBから件数を取得して、その配列を確保してから処理を行うべきです。 また、Webでは大量の配列をハンドリングすることはなく、ページング処理でデータを部分取得しますが、そのような場合でも、ループ中で静的配列の確保をを繰り返してはいけません。