将fopen()的内存使用量合并到一起的许多文件
问题描述:
我有很多文件块,我需要使用PHP fopen函数合并它们。但是,我对内存使用感到担忧。 例如,我在split_hash.txt
中列出了约100个文件,每个文件约为100MB。在这里,我将它们结合在一起:将fopen()的内存使用量合并到一起的许多文件
<?php
$hash = file_get_contents("split_hash.txt");
$list = explode("\r\n",$hash);
$fp = fopen("hadoop2.zip","ab");
foreach($list as $value){
if(!empty($value)) {
$handle = fopen($value,"rb");
fwrite($fp,fread($handle,filesize($value)));
fclose($handle);
unset($handle);
}
}
fclose($fp);
echo "ok";
会花费我很多的记忆吗?
答
这将会耗费很多我的记忆是否可以接受?
如果您使用fread($handle,filesize($value))
来获取fread文件的整个长度,请在每个文件较小的块中使用fread。
我会改变:
fwrite($fp,fread($handle,filesize($value)));
到:
while (!feof($handle)) {
fwrite($fp,fread($handle,1048576));
}
让你只用10兆字节在同一时间处理
答
这将花费您在内存高峰期的100个文件大小的最大值。
您正在读取整个文件并将其写入另一个文件。在这种情况下,您拥有多少个文件并不重要,但是它的重要性在于文件的大小。
你说这是〜100 MB,使用默认的PHP设置是128 MB的内存限制,这是你的情况
我觉得你最大的挑战将是脚本执行时间。 – Scuzzy
会花费很多时间吗?我正在处理分块上传,因此它必须快速。 –
这将取决于您的基础设施,例如,本地SSD上的数据服务器将快速执行文件系统激活。我认为你只需要尝试一下,看看需要多长时间处理100个文件100个文件 – Scuzzy