2017-10-29 61 views
0

我有很多文件塊,我需要使用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";  

會花費我很多的記憶嗎?

+0

我覺得你最大的挑戰將是腳本執行時間。 – Scuzzy

+0

會花費很多時間嗎?我正在處理分塊上傳,因此它必須快速。 –

+0

這將取決於您的基礎設施,例如,本地SSD上的數據服務器將快速執行文件系統激活。我認爲你只需要嘗試一下,看看需要多長時間處理100個文件100個文件 – Scuzzy

回答

1

這將會耗費很多我的記憶是否可以接受?

如果您使用fread($handle,filesize($value))來獲取fread文件的整個長度,請在每個文件較小的塊中使用fread。

我會改變:

fwrite($fp,fread($handle,filesize($value))); 

到:

while (!feof($handle)) { 
    fwrite($fp,fread($handle,1048576)); 
} 

讓你只用10兆字節在同一時間處理

0

這將花費您在內存高峯期的100個文件大小的最大值。

您正在讀取整個文件並將其寫入另一個文件。在這種情況下,您擁有多少個文件並不重要,但是它的重要性在於文件的大小。

你說這是〜100 MB,使用默認的PHP設置是128 MB的內存限制,這是你的情況

相關問題