2013-08-02 87 views
0

我正在建立一個網站,其基本前提是有兩個文件。 index.php和file.txt。PHP文件尋求性能優化

File.txt具有(當前)10megs的數據,可能高達500mb。該網站的想法是,人們去index.php,然後可以尋求文件的任何位置。另一個特點是他們可以從搜索的角度讀取10kb的數據。所以:

index.php?pos=432將獲得文件上位置423的字節。從555位

開始

index.php?pos=555&len=5000將得到的數據5KB從文件現在,想象一下,該網站得到數千次點擊的日子。

我目前使用fseekfread來提供數據。有沒有更快的方法來做到這一點?或者我的用法太低,無法考慮高級優化,例如緩存每個請求的結果或將文件加載到內存中並從中讀取?

+0

現階段您應該考慮使用帶索引的數據庫。 –

+0

然而,文件中的數據不會以任何方式進行人工編輯。它實際上只是存儲隨機系列的數字和字母。應用程序將根據用戶的請求檢索任意數據段(最多10kb)。所以有人可能會要求位置10的1000個字節和位置11的1000個字節。雖然結果幾乎相同,但它們是不同的。你的數據庫實現如何解決這個問題? – Ozzy

回答

0

每天點擊數千次,就像每隔幾秒鐘一次?這肯定太低,不需要優化,所以只要使用fseek和fread,如果這對你來說最簡單。

+0

我明白你的意思了。它可能不會超過每秒幾個最大值。那麼如果它不值得擔心優化,我想我會繼續使用fseek和fread。我只是不想最終在硬盤上創建一個瓶頸 – Ozzy

+0

當用戶開始均勻訪問網站時?如果他們大部分會在幾個小時內到來會怎麼樣? –

+0

@Eugene,即使所有用戶在一分鐘內訪問該網站,就磁盤而言都無關緊要。即使是消費級桌面系統每秒鐘也能處理大約100次磁盤搜索,而且如果文件經常被訪問,操作系統將在虛擬內存中提供請求,而無需實際訪問磁盤。 – Joni

0

如果將所有數據保存到一個文件是至關重要的,我建議您將文件分割成一小塊較小的文件。

因此,例如,您可以做出決定,即文件大小不應超過1 MB。這意味着,你有你的file.txt文件拆分成10個不同的文件:file-1.txtfile-2.txtfile-3.txt等等...

當你將處理一個請求,你需要確定由師pos爭論什麼文件皮卡文件大小和顯示適量的數據。在這種情況下,fseek功能將工作得更快,也許...

但無論如何,你必須堅持fseekfopen功能。

0

編輯:現在,我認爲,只要你使用fseek()去抵消字節,然後使用fread()獲得AA一定數量的字節它不應該是一個問題。出於某種原因,我從一個真正可怕的文件中讀取了你的問題,因爲它服務於X個


的問題是你是絕對錘擊與IO操作的磁盤,你不只是導致性能問題與這一個文件/腳本,你造成任何事情,需要的是磁盤性能問題。其他用戶,操作系統等,如果你在共享主機我保證,其中一個系統管理員正在試圖找出你是誰,所以他們可以關閉你。 [我會]

你需要找到一個辦法之一:

  1. 卸載此內存。
    在將文件加載到內存並根據請求提供塊的服務器上設置守護程序。
  2. 卸載此更有效的東西,如mySQL。
    你已經服務於連續的塊中的數據,例如:管線466到476,這將是更快速地從表中檢索的數據等:

    CREATE TABLE mydata (
        line INTEGER NOT NULL AUTO_INCREMENT, 
        data VARCHAR(2048) 
    ) PRIMARY KEY (line); 
    

    由:

    SELECT data FROM mydata WHERE line BETWEEN 466 AND 476; 
    
0

如果文件永遠不會改變,並且真正受限於最大尺寸,我只需掛載一個ramdisk,並有一個引導腳本將文件從永久存儲器複製到RAM存儲器。

這可能需要託管在Linux上的網站,如果你還沒有。

這將允許您保證從內存中提供文件段,而不依賴於操作系統文件系統緩存。