アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になります。

ASP(VBScript)で教えて頂きたいことがあります。

VBScriptにはJavaでいうArrayListのようなコレクション機能がないので、動的配列を実現するためには
ReDim PreserveやScripting.Dictionaryを使用しなければなりませんよね。

そこで、DBから取得したレコードを、ループする度毎にReDim Preserveを使用し、データをセットするよう
な実装をしていました。すると、ReDim Preserveは問題があるのでやめた方がよい、と言われました。

具体的には、ReDim Preserveをすることによって、新たに配列を作成し、古い内容をコピーするため、
倍々にメモリを食いつぶしていくことになり、それが大きくなるとどんどん遅くなっていき、そしてメモリリーク
になる、ということでした。

自分なりに調べてみたのですが、そのような記事を見つけることができませんでしたし、JavaのArrayList
でも内部的には配列を持っており、配列の再作成などをやっています。
○○百万件などといった大量件数を扱う際は、それはメモリリークにならないような設計、実装をしなければ
ならないとは思うのですが、それはどの言語でも共通で言えることであって、特別にVBScriptではやめた方がよい、
とは思えません。

ReDim Preserveを使用しても、先に述べたような認識をもっていれば問題ないと思うのですが、どうでしょうか。
VBScriptは、こういう仕組みだから駄目なんだ、という理由があるのでしょうか。もしあれば、根拠となる
サイトなど教えて頂けると嬉しいのですが。。。

宜しくお願い致します。

A 回答 (1件)

VBScriptのReDim Preserve(懐かしい)に限らず、静的配列の確保というのは、非常にコストのかかる処理で、それをループで連続実行することは何にせよ良くありません。


また、コレクション系の変数は、静的変数と違って、ポインタを用いた可変データストアが可能なため、アクセス速度やメモリ効率は劣るにせよ、データ量が可変する配列を収めるには必須のものだと思います。
JavaのArrayListが、内部的に静的配列で処理されているというのは初耳です。
そのようなことはあり得ないと思いますが、ご質問の趣旨からは外れますので、あえて突っ込みません。

「コレクションやジェネリックが完璧に使えるASP.NETでなく、何で今さらASP?」という素朴な疑問はありますが、どうしてもASP/VBScriptでReDim Preserveを使うのであれば、いったんDBから件数を取得して、その配列を確保してから処理を行うべきです。

また、Webでは大量の配列をハンドリングすることはなく、ページング処理でデータを部分取得しますが、そのような場合でも、ループ中で静的配列の確保をを繰り返してはいけません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!