• ベストアンサー

インスタンス化に伴うメモリ消費への対策(メモリの解放)について

hogehoge78の回答

回答No.6

結局のところ、70kbあるファイルに対して何をしているのかが明確に分からないので、近いライブラリというのがどういうものかも不明瞭ですが、 HTMLをパースして、オブジェクトや配列に直すというのが近いと仮定すると、 http://simplehtmldom.sourceforge.net/ こちらのPHP Simple HTML DOM Parserなんかはどうでしょう。 HTMLファイルを文字列でパースしてオブジェクトにします。 http://digit.que.ne.jp/work/wiki.cgi?PHP%E3%83%A1%E3%83%A2%2FHTML%E3%81%AE%E8%A7%A3%E6%9E%90 こちらの関数は、正規表現でHTMLを解析するというものです。

march4
質問者

補足

>こちらの関数は、正規表現でHTMLを解析するというものです。 あ~、私のしようとしていることに、なんとなく似ていました。 ということで、早速、こちらがどんな動きをするのか試用してみましたところ、 ブラウザに出力される情報量が多い!なのに、速い! 同じhtmlソースを使っているというのに、私のスクリプトより高性能なわけです。 そこで、自分のスクリプトの何が悪いのか、アレコレいじって、私なりに調べてみました。 その結果、処理速度を上げる方法が1つ見つかりました。 ただ単に、 それまでの方法に比べ、相対的に処理が速くなる方法を1つ見つけたに過ぎないのですが。 で、その方法ですと、速度が体感的に(自分で数えたりなんかして)、倍、速いのです。 4秒の処理が2秒に。これは大幅なスピードアップです。 その方法とは! array、whileを使わない、という単純なものです。笑 前回の補足で、配列に正規表現パターンを入れ、 そのパターンの数だけ、whileでpreg_matchする、なんてお話をしましたが、 その方法を、原始的に1つずつ手書きして処理する方法に換えた所、 速くなったというわけです。 ただ、その副産物として、ソースはかなり冗長になり、 また、見た目の美しさも悪くなります。笑 私はまだ駆け出しの日曜プログラマなので、 何を重視してソースを書くべきかがよく分かっていないようです。 結果的に、スクリプトが速く正確に動く、 これをまず第一に考え、 つづいて、保守性の高さ、 なんかを考えますが、 これらを達成する上で、 同じ事の繰り返し処理を書く必要が出てきた場合に、 ちょっと前までの私であれば、迷わず、 配列やwhileなどを多用し、ソースをスッキリさせることを考えていました。 (馬鹿の1つ覚えのように、覚え立てのスマートな道具達を片っ端から使っている、という状態) しかーし! 今回わかったことですが、 ソースの整理整頓が保守性向上に好影響をもたらすことには、疑いの余地はありませんが、 処理速度を速くするかどうかについては、ケースバイケースなのだなと、 そのことに気付いたわけです。 配列やwhileは、確かに便利です。 どちらも、ソースの省スペース化に役立ち、 それは同時に、手書きする人間の手間暇を減らすことにもつながります。 (また、仕組み的に、動的に対応せざるを得ない場合には、配列やwhileを使わないと スクリプト作成不可能な場合もあるかもしれませんね。) その意味では、arrayもwhileも便利な道具なのでしょうが、 単純に、変数が多くなったから配列化しとこー、とか、 繰り返し処理がちょっと多くなってきたから、この際、whileで書いておこー、 なんて気持ちでは使うべきではないなと感じたわけです。 必要であれば使うべきだけれども、使わないですみそうなら、 使わないにこしたことはない、みたいな印象を受けました。 (かなり、過激なことを言っているかもしれません。笑)←ツッコミ大歓迎です 例えば、 変数が10個、繰り返し処理が10回、なんて場合は、 arrayやwhileは試用せずに、手書きでゴリゴリ10回書いた方が速い、 のではと、今回思ったわけです。 今回のこの1例だけで結論を下すのは早計かもしれませんが、そんな風に思いました。 こういった、PHPのコマゴマとした論議も、いつかまとめて、 させて頂きたいと思っていたりしますが、ここではこのくらいにしておきます。笑 (余談ですが、毎回、gooの字数制限と格闘しています。苦笑)

関連するQ&A

  • インスタンス破棄時にメモリが解放されるようにしたい

    C++言語でプログラムを作成しています あるクラスでインスタンス生成時に動的にメモリを割り当てた後 インスタンスが破棄されるまでそれを使用し インスタンス破棄時に解放するにはどうしたらいいでしょうか デストラクタで解放処理を実装すると 明示的にデストラクタが呼ばれた際に解放されてしまい インスタンスが破棄されるまで使用できませんでした

  • インスタンスオブジェクトとは何かについて教えて!!

    下記内容はあるサイトのインスタンスについての説明文です。 画像は、自分なりに理解したものです。 (1)メモリ上には記憶場所(=ポインタ)はない (2)var Aa = new Bb("13" , "smole");とscript内に追加されたことにより メモリ上に記憶場所(=ポインタ)が作成され、 BbオブジェクトつまりBb("13" , "smole");がその記憶場所(=ポインタ)に入る (3)そしてBb("13" , "smole");が入った 記憶場所(=ポインタ)にAaという名前を付ける。 考え方に間違いがあるでしょうか? ---------------------------------------------------- var Aa = new Bb("13" , "smole"); これは、BbクラスオブジェクトのBbコンストラクタをnew演算子を利用して起動しています。 new演算子は、メモリ上に記憶場所を確保して、Bbオブジェクトを作成した後、そのポインタを返す演算子です。 new演算子から返されたポインタは、Aaへ格納されます。この場合のAaをBbオブジェクトのインスタンスといいます。 また、new演算子でメモリ上に記憶場所を確保して作られたオブジェクトをインスタンスオブジェクトといいます。 つまり、 オブジェクト == インスタンスオブジェクト で、 インスタンス != インスタンスオブジェクト インスタンス != オブジェクト です。 ----------------------------------------------------

  • インスタンス生成について

    いつもお世話になっております。 今回はインスタンス生成について質問させて下さい。 String クラスのインスタンス生成は、 String str1 = new String(); のように明示的に new 演算子を用いる方法と、 String str2 = "hoge"; のように生成する方法がありますよね。 str2 の方は、JVM が(?) 勝手にコンストラクタを呼び出してくれて、 インスタンスを生成してくれる、という認識でよいのでしょうか? また、明示的に「 new 演算子 + コンストラクタ」でインスタンスを生成する場合と、 そうでない場合の使い分けなどはあるのでしょうか? そもそも String 以外に、このような複数のパターンでインスタンスを生成することができる クラスは他にもあるのでしょうか? 以上、ご教授宜しくお願い致します。

    • ベストアンサー
    • Java
  • (C++) for文内でのインスタンス生成について

    はじめまして。 いつも色々と質問を読まさせて頂いています。 早速タイトルの質問についてですが、for文の中でループさせながらインスタンスを生成しようとしています。 for (int i=0; i<10; i++) { MyObject *obj = new MyObject(); int intX = new int(100); // メモリのアドレスを確認 printf("%p¥n", &obj); printf("%p¥n", &intX); } この結果、 0xbfffd7dc 0xbfffd7f0 0xbfffd7dc 0xbfffd7f0 0xbfffd7dc 0xbfffd7f0 0xbfffd7dc 0xbfffd7f0 . . のようになり、どうも同じメモリアドレスを参照したインスタンスが生成されているようです。 やりたい事は、10回のインスタンスの生成をforで手抜きして行いたいのですが、この方法ですとすべて同じインスタンスとなってしまい、 別の処理でとある一つのインスタンスに変更を加えると、すべてのインスタンスにも変更がかかってしまいます。 これを実現する方法はあるのでしょうか。 解決方法として、forを使わずに、 MyObject *obj1 = new MyObject(); MyObject *obj2 = new MyObject(); . . とやれば別アドレスの参照となることは分かったのですが。。。 初歩的な質問だと思いますが、お知恵をお借りできればと思います。 よろしくお願いします。

  • メモリを解放しないとどうなる?

    趣味でプログラムの勉強をしています。 初歩的な質問になると思いますが、よろしくお願いします。 C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、解放の処理をしないままプログラム(アプリケーション)を終了した場合にはシステム(OS?)的にはどのような状態になるのでしょうか? 例: ・malloc して free しない ・new して delete しない 確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減る(解放にはPCの再起動が必要)のでしょうか? それともアプリケーションの終了時に自動的に解放されるのでしょうか? Windowsの場合を想定してご回答いただだけると嬉しいです。

  • ASP.NET(C#)のメモリ解放について

    少し質問しづらいのですが、 ASP.NET(C#)でメモリ解放を行う場合、 ・変数 ・インスタンス ・セッション の3つを使い終わった後に、nullやRemoveしておけば、 そのうちガベージコレクションでメモリ解放されるのでしょうか。 他にも何か使い終わった後に処理しておかないといけない、 (データ接続などを閉じておくなど)

  • インスタンスを消滅させる方法

    PHPでAccessのインスタンスを生成しましたが、 これが消滅せずに残ってしまいます。 Submitの度にインスタンスが増えて困ります。 インスタンスを消滅させる方法をご教授ください。 以下に試した方法を記載します。 いずれも成功しませんでした。 (1) $ap = new COM("Access.Application"); $ap->Quit(); unset($ap); (2) $sc = new COM("ScriptControl"); $sc->Language = "VBScript"; $sc->ExecuteStatement("Dim A"); $sc->ExecuteStatement("Set A=CreateObject(\"Access.Application\")"); $sc->ExecuteStatement("A.Quit"); $sc->ExecuteStatement("Set A=Nothing"); $sc->Reset(); unset($sc); 以上、よろしくお願いします。

    • 締切済み
    • PHP
  • javascriptのObject()コンストラクタについて質問です。

    javascriptのObject()コンストラクタについて質問です。 var obj = new Object(); var obj2 = Object(); console.log(obj === obj2)//false いつも質問ばかり恐縮です。。。 どこかのサイトでこの2つは等価みたいな記事を読んだような気がするのですが、 ということはObjectコンストラクタでオブジェクトを作る際はnew演算子は要らない?? のでしょうか?? またobjとobj2の2つの違いを色々試したのですが違いがわかりません。new演算子を 付けたインスタンスと付けないインスタンス??の違いをどなたか ご教授いただけると助かります。

  • newを書く場所とか挙動について、分からないので

    newについて、幾つか分からないことがあるので、教えてください ■newしたら、その状態はどこまで保持されるのでしょうか? あるサイトに、 >PHPスクリプトは、処理が全て終了すると共に、メモリは開放されます と書かれていたのですが、 この場合の「処理」は、何を意味するのでしょうか? ファイルの一番最後まで来たら、newで確保した何かは自動的に解放される、 という意味でしょうか? <例> ・a.php ・b.php ・c.php … クラス記述 ・aからbへPOST ・aでもbでも、cのクラスを利用したい この場合、a、b両方のファイルに、必ず、new C と書かなければいけないのでしょうか? それとも、ファイルaにだけ、new C と書いて、 bで、require_once("a.php");としてもよいのでしょうか? あるいは、他に何か書き方があるのでしょうか? <選択肢> ・使いたいファイルで必ずnewする必要がある ・使いたいファイルで必ずしもnewする必要はない ■インスタンス名は違ってもよいのでしょうか? 上記例で、 ・ファイルaに、hoge1=new C; ・ファイルbに、hoge2=new C; とやってみたらエラーにならなかったのですが、 ということは、例えば同じクラスを複数のファイルで利用したい場合、 どうするのがいいのでしょうか? <選択肢> ・new する際、常に同じインスタンス名を利用 ・new する際、ファイル毎に異なるインスタンス名を利用 ・new する際のインスタンス名は、同じでも違っても、どっちでもよい

    • ベストアンサー
    • PHP
  • Java インスタンス作成のイベント取得方法

    インスタンス化したことをイベントで取得することはできますか? 例) public class MyClass{ private MyDialog dialog = null; public void action(){ dialog = new MyDialog(); //ダイアログの中身の処理・・・(1) dialog.show(); } public MyDialog getDialog(){ return dialog; } } public class MyDialog extends JDialog{ (省略) } 前提 クラスMyClassの中身は変更することができない。 やりたいことは、MyClass#action()が呼ばれるたびに MyDialogにはってあるオブジェクトに命令を行いたい。 MyDialogのインスタンス作成イベントを取得できれば 上記を実現できると考えています。 以上です。

    • ベストアンサー
    • Java