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