0

フォルダには、34,000の構成ファイルがあります。各ファイルには、固有の構成仕様を持つオブジェクトが含まれています。ファイルの内容の例を次に示します。

$obj = new obj();
$obj->name = "name":
$obj->location "nyc";
...
...
etc

各ファイルの長さは約100〜200行で、サイズは約17kです。

これらをデータベースに取り込むために、次の関数があります。

function retrieve_files(){
    $objs = array();

    $path = 'filefolder';

    //retrieve a list of files as an array of objects
    $files = get_files('/\.inc$/', $path, 'filename', 0);

    foreach ($files as $file) {
            include_once $path.'/'.$file->filename;
            $objs[$obj->name] = $obj;
    }

    return $objs;
}

オブジェクト配列が返されると、それは別の関数でループされ、シリアル化され、それぞれがデータベースに保存されます。

現在、私のサーバーは8ギガヘルツのRAMを搭載したIntelデュアルコア3.06Ghzプロセッサです。Ubuntu12.04のコマンドラインからスクリプトを実行しています。

スクリプトが処理するにつれて、CPUは100%で最大になり、8つのギグがすべて最大になるまでメモリが増加します。その後、スクリプトがクラッシュします。

このスクリプト、または全体的な処理をより効率的にするにはどうすればよいですか?できれば、この機能の範囲内にとどまりたいと思います。また、これを1回のパスで実行したいと思います。アレイが作成され、ループが繰り返されるときに、より少ないリソースを使用するか、リソースを解放するこれをリファクタリングする方法はありますか?

4

2 に答える 2

0

最初の関数の最後にある最終的な配列にオブジェクトが多すぎることは明らかです。

34,000 個のファイルは、配列内に 34,000 個のオブジェクトがあることを意味します$objects

オブジェクトをループに保存する必要があるかもしれません。含まれるファイルごとに、シリアル化されたオブジェクトをデータベースに保存します。1 つの構成ファイルに対して DB に 1 行が作成されます。

于 2013-03-18T06:09:56.817 に答える
0

すべてのオブジェクトを返すのではなく、一度に 100 オブジェクトと言いますか。だから、このようなもの

function retrieve_files(){
    $objs = array();

    $path = 'filefolder';

    //retrieve a list of files as an array of objects
    $files = get_files('/\.inc$/', $path, 'filename', 0);
    $count = 0;
    foreach ($files as $file) {
            include_once $path.'/'.$file->filename;
            $objs[$obj->name] = $obj;
            if ( $count++%100 == 0 )
            {
                function_to_process_obj($objs);
                $objs = null;
                $objs = array();
            }
    }
}
于 2013-03-18T06:22:20.113 に答える