0

gzip で圧縮された大きなファイル (~15Gb 圧縮、~88 非圧縮) があり、コンテンツを大量のファイルに「展開」する必要があります。たとえば、次の行を読んだ場合:

foo    property.content    "I'm the content of the string."

という名前のファイルを作成し、foo.db内部に保存する必要があります。

property.content    "I'm the content of the string."

私はそれを手に入れることに成功しました。しかし、私はパフォーマンスの問題を抱えています。おそらくファイル容量が大きいためだと思います。(60 秒で最大 31,000 個のファイルが作成されました) しかし、よくわかりません。これが私がここにいる理由です。

私のコードは、1048576 バイト (gz ファイルのgzread) の各部分を読み取り、配列内のコンテンツを並べ替えて、すべてのコンテンツをファイルごとに 1 回書き込みます。次に、 foreach ループを作成してキャッシュの内容を読み取り、特定のファイルを開いて書き込みます。たとえば、キャッシュが次のようになっている場合:

$cache = array(
    "file_one" => "property.content    \"I'm the content of the string.\"
                   property.foo    \"I'm the content of another string.\"",
    "file_two" => "property.foobar    \"I'm the content of the another string.\"",
    "file_three" => ...
);

ループはこれを作ります:

foreach ($cache as $file => $content) {

    $filesrc = $file . ".db";
    $fp = fopen($filesrc,"a");
    fwrite($fp,$content."\n");
    fclose($fp);

}

この方法では、60 秒で最大 65Mb のファイルを読み取り、最大 31k のファイルを書き込みます。1 つのファイルのすべてのコンテンツを読み取ると、60 秒で ~220Mb を書き込みました。

パフォーマンスを向上させ、小さなファイルを作成するために何かすることはありますか? 私はonを使用PHP 5.5.1しており、このスクリプトを使用しています。Apache 2.4.6WindowsCLI

編集:これは、131072バイトのデータが読み取られた場合の、各ループの時間プロファイルを取得するためのログです:http://pastebin.com/uRPFfywY

4

0 に答える 0