2012-02-08 54 views
1

我有閱讀整個文件中的數組(十六進制)後存儲在內存中一個非常大的陣列是這樣的:PHP大數組操作

$bin_content = fread(fopen($filename,"r"),filesize($filename)); 
$hex_decode = explode(" ",chunk_split(bin2hex($bin_content),2," ")); 
unset($bin_content); 

function myfunction($i) { 
    global $hex_decode; 
    // stuff here 
} 

當我創建一個使用此$hex_decode數組作爲全球功能...腳本像永遠一樣運行(非常慢),但是如果我將該函數作爲參數傳遞給$hex_decodemyfunction($i,$hex_decode) instead of myfunction($i) in which $i is a pointer),則事情會更快。

任何人都可以解釋爲什麼嗎?有沒有什麼方法通過用不同的方法讀取文件來加速腳本。

我需要將數組中的整個文件逐行排列,因爲我構建了一個自定義的ASN.1解碼器,並且我需要全部使用它。

+0

避免全局性的另一個原因。 – Zenexer 2012-02-08 08:16:40

+0

如果您要一次讀取所有文件,請使用爲其創建的函數:'file_get_contents'。 – deceze 2012-02-08 08:22:43

+0

所以在PHP中的全局有問題?謝謝你的答案 – pufos 2012-02-08 08:27:23

回答

1

如果你的文件可以是巨大的,你可以考慮內存保守的方法。 ASN.1通常以類型長度值的結構進行編碼,這意味着您不必將整個內容存儲在內存中,只需要在任何給定時間處理您需要處理的數據。

+0

是的..但是思科設備有時會給某些記錄提供錯誤的長度字節,我必須在內存中爲它做全部檢查和返回。如果ASN.1總是正確的,那麼我會像你說的那樣做。 – pufos 2012-02-08 08:48:38

2

有沒有什麼方法通過以不同的方法讀取該文件來加速腳本。

個人而言,我會使用一個stream filter來塊讀取和轉換的文件,因爲它是閱讀,而不是整個文件讀一氣呵成,然後轉換,並在內存中的整個文件固定,搬運任何過濾並在流過濾器中固定ASN.1結構。

我知道這不是對實際問題的直接回應,而是對上面的單引號;但它可以提供更少的內存需求。

+0

聽起來有趣和複雜:| – pufos 2012-02-08 09:13:11

+0

它不像聽起來那麼複雜,一旦你將思想包圍在想法之中......儘管文檔中缺乏比通過流過濾器更改文件中的文本大的更復雜的示例。 。我懷疑缺乏好的代碼示例會讓它感覺像是一種「黑色藝術」。 – 2012-02-08 09:35:46