2012-04-23 33 views
1

我有一個腳本,做了一大堆的一個二進制文件的freadfseek通話,使用這樣創建的文件指針:是否有更有效的方式來處理二進制文件?

$fp = fopen('r','mybinaryfile'); 

的腳本約2,500單獨的文件涉及的二進制內,每個這會吸引多個fseekfread調用,因此對文件指針的總操作可能遠遠超過20,000。

我是否正確地認爲使用我的$fp文件指針進行的每個調用都會導致磁盤上的物理讀操作?

如果是這樣,我想知道是否將整個文件加載到內存並像這樣工作會更好。會嗎?

目前,當我運行這個腳本,大約需要20秒。對我來說似乎還有改進的餘地。

編輯:而且,如果有可能將文件帶入內存,那麼如何實現這一目標,同時堅持使用指針方法?每個文件只有大約3MB,因此內存不足不應該成爲問題。

+1

只要您有足夠的內存以適合它,將整個內容加載到內存中會更快,否則它有點不便。總而言之,只要你不需要每分鐘運行一次,20秒就沒有問題。 – Louis 2012-04-23 01:48:50

+0

我想我的問題也是如何將它加載到內存中嘿......但謝謝你的回答。我會更新這個問題。 – Alex 2012-04-23 01:50:28

回答

1

上午我就在想,每個用我的$ fp的文件 指針導致磁盤上的物理讀操作這些呼叫的?

不,不一定。操作系統會將文件緩存到內存中,以便讀寫操作不必立即打開磁盤。 OS'es也很擅長這樣做。

這是一種將整個文件讀入內存並仍然能夠使用文件流操作的方法。

$content = file_get_contents('large_file.bin'); 
$membuf = fopen("php://memory", "w+b"); 
fputs($membuf, $content); 
unset($content); 
rewind($membuf); 

// now you can read and seek on $membuf using the usual stream functions fseek, fread etc 
+0

謝謝,這正是我正在尋找。儘管如此,它並沒有真正加快速度,所以我想你的操作系統緩衝是正確的! – Alex 2012-04-23 02:39:07

0

通過將整個文件作爲字符串或數組讀取到變量中而將其存儲在內存中。做任何你想做的事,然後寫回來。唯一的問題是,當PHP腳本在內存中工作時,其他人可能會編輯該文件,因此您可能需要在讀取文件後鎖定文件,並在寫入之前解鎖。

0

只要你有足夠的內存來容納你的文件,如果你在文件上做了很多事情(不僅僅是一次性操作),將你的二進制文件加載到內存中應該更好。

在PHP中,裝載文件到內存中,你可以使用file_get_contents

file_get_contentshttp://php.net/file_get_contents

$content = file_get_contents('mybinaryfile'); 

// $content is a string containing the whole content of your binary 

然後,您可以 「點」 上使用數組引用文件的任何地方,

$content[100]; // the 101th character of your binary 

完成後,要將其寫回,請使用file_put_contentshttp://php.net/file_put_contents

file_put_contents('mybinaryfile', $content); 
+0

您不應該在二進制文件上使用'file'。 – deceze 2012-04-23 01:55:07

+0

@deceze編輯,謝謝:) – 2012-04-23 01:56:47

相關問題