我有一个很大的 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 秒内创建了约 31k 个文件)但我不确定。这就是我在这里的原因。
我的代码正在读取每一块 1048576 字节(带有 的 gz 文件gzread
),并对数组中的内容进行排序,以便按文件一次写入所有内容。然后,我做了一个 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 文件。如果我读取一个文件中的所有内容,我会在 60 秒内写入 ~220Mb。
有什么办法可以提高性能和创建小文件?我正在使用PHP 5.5.1
with Apache 2.4.6
onWindows
并且正在使用CLI
这个脚本。
编辑:这是获取每个循环的时间配置文件的日志,读取 131072 字节的数据:http: //pastebin.com/uRPFfywY