一種文件讀取方法、存儲設備及讀取系統的製作方法
2023-04-28 01:38:36 1
一種文件讀取方法、存儲設備及讀取系統的製作方法【專利摘要】本發明實施例提供了一種文件讀取方法、存儲設備及讀取系統,涉及文件讀取領域,該方法包括:存儲設備接收客戶端發送的第一讀取請求,第一讀取請求請求的待讀數據是文件的一部分;從緩存中讀取待讀數據中位於緩存中的數據,從第一存儲介質中讀取待讀數據中沒有位於緩存中的數據;從第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到緩存中,預讀的容器中包含有文件的至少一個未讀取文件分片。存儲設備包括:接收模塊、讀取模塊和預讀模塊。讀取系統包括:用戶設備和前述存儲設備。本發明可以減少讀取數據的時間開銷,且不需要額外的硬體開支,節省了硬體成本。【專利說明】—種文件讀取方法、存儲設備及讀取系統【
技術領域:
】[0001]本發明涉及文件讀寫領域,特別涉及一種文件讀取方法、存儲設備及讀取系統。【
背景技術:
】[0002]DataDe-duplication(重複數據刪除)技術廣泛應用於存儲領域。以備份系統為例,DataDe-duplication技術順序讀取待備份文件中一定大小的數據塊,並檢索之前已備份的數據塊中是否已經存在相同的數據塊。若存在與待備份數據塊相同的已備份數據塊,則不備份,而讓待備份的文件引用之前已備份的數據塊;只備份沒有檢索到的數據塊。這裡,將引用了之前已備份的數據塊的文件稱為重複數據刪除文件(下文簡稱重刪文件)。存儲系統中已備份數據塊,也稱為重複數據塊。[0003]由於引用了之前已備份的數據塊,而這些被引用的數據塊是分多次備份的,所以重刪文件所具有的數據塊或者說組成重刪文件的數據塊,在磁碟上的物理位置通常不是連續的。因此,重刪文件的讀取過程實際上是一個從包含有數據碎片的磁碟中讀數據的過程,需要從磁碟中經過若干次的磁碟尋道才能讀出所有數據塊,而且磁碟的讀取速度本身比較慢,這樣會增加讀取過程所用的時間開銷。為了解決該問題,現有技術提供了一種重刪文件的讀取方法。具體地,該方法採用額外的存儲設備作為Cache(緩存),將備份的所有重複數據塊存放在該額外的存儲設備上。讀取重刪文件時,只要讀取的數據塊引用了已備份的數據塊,就從該額外的存儲設備中讀出相應的重複數據塊。[0004]在實現本發明的過程中,發明人發現現有技術至少存在以下問題:[0005]由於備份的重複數據塊的數據量龐大,所以採用的存儲設備的容量也很大,並且為了保證讀取速度,該存儲設備的性能需要比硬碟的性能要高,通常採用的額外存儲設備為固態硬碟(SolidStateDisk,簡稱SSD),而該SSD價格昂貴,從而增加了硬體成本。【
發明內容】[0006]為了節省硬體成本並提高文件的讀取性能,本發明實施例提供了一種文件讀取方法、存儲設備及讀取系統。所述技術方案如下:[0007]第一方面,本發明實施例提供了一種文件讀取方法,適用於讀取存儲在存儲設備上的文件,所述存儲設備包括第一存儲介質和緩存,所述緩存的訪問速度大於所述第一存儲介質的訪問速度,所述第一存儲介質上有多個存儲容器,所述文件包括多個文件分片,所述方法包括:[0008]所述存儲設備接收客戶端發送的第一讀取請求,所述第一讀取請求請求的待讀數據是所述文件的一部分;[0009]從所述緩存中讀取所述待讀數據中位於所述緩存中的數據,從所述第一存儲介質中讀取所述待讀數據中沒有位於所述緩存中的數據;[0010]從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,預讀的容器中包含有所述文件的至少一個未讀取文件分片。[0011]可選地,所述從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,包括:[0012]從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器中,包含所述預定量的文件分片的數量大於閾值的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0013]可選地,所述方法還包括:[0014]在所述預定量的未讀取文件分片中,選擇包含所述未讀取文件分片的數量不大於所述閾值的容器內的所述未讀取文件分片,將選擇出的所述未讀取文件分片預讀出並存儲到所述緩存中。[0015]可選地,所述從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器中,包含所述未讀取文件分片的數量大於閾值的容器內的數據預讀出來,包括:[0016]獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;[0017]在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;[0018]在獲取到的地址指針指向的文件分片所在的容器中,統計各所述容器被所述預定量的地址指針所指向的次數;[0019]比較統計的次數是否大於所述閾值,若統計的次數大於所述閾值,則將所述次數大於所述閾值的容器內的數據預讀出來。[0020]可選地,所述從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,包括:[0021]從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0022]可選地,所述從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器內的數據預讀出來,包括:[0023]獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;[0024]在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;[0025]將獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。[0026]可選地,所述從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,包括:[0027]從所述第一存儲介質中,按照預定量的未讀取文件分片所在的容器的序號順序,將至少一個包含所述預定量的文件分片的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0028]可選地,所述從所述第一存儲介質中,按照預定量的未讀取文件分片所在的容器的序號順序,將至少一個包含所述預定量的文件分片的容器內的數據預讀出來,包括:[0029]獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;[0030]在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;[0031]按照獲取到的地址指針指向的文件分片所在的容器的序號順序,將至少一個獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。[0032]可選地,所述在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針,包括:[0033]在所述文件的地址指針表中,以所述第一地址指針為起始指針,比較所述地址指針表中所述第一地址指針之後的所有地址指針的數量是否不大於預定量;[0034]若所述第一地址指針之後的所有地址指針的數量大於預定量,則獲取所述第一地址指針之後的所有地址指針,[0035]若所述第一地址指針之後的所有地址指針的數量不大於預定量,則獲取所述預定量的地址指針。[0036]可選地,所述預定量的未讀取文件分片在所述文件中是連續的,且所述預定量的未讀取文件分片在所述文件中,與所述待讀數據對應的文件分片相鄰。[0037]可選地,所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:[0038]所述存儲設備接收到所述第一讀取請求的時間在預定時間內;[0039]所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;以及;[0040]在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量。[0041]可選地,所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:[0042]所述存儲設備接收到所述第一讀取請求的時間在預定時間內;[0043]所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;[0044]在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量;以及;[0045]所述第一讀取請求請求的待讀數據對應的文件分片為,在上一次預讀時,所述預定量的未讀取文件分片以外的未讀取文件分片。[0046]可選地,所述方法還包括:[0047]所述存儲設備接收客戶端發送的第二讀取請求,所述第二讀取請求請求的待讀數據是所述文件的一部分;[0048]從所述緩存中,讀取所述第二讀取請求請求的待讀數據中,位於所述緩存中的數據;[0049]從所述第一存儲介質中,讀取所述第二讀取請求請求的待讀數據中,沒有位於所述緩存中的數據。[0050]第二方面,本發明實施例提供了一種文件存儲設備,所述存儲設備用於存儲文件,所述存儲設備包括第一存儲介質和緩存,所述緩存的訪問速度大於所述第一存儲介質的訪問速度,所述第一存儲介質上有多個存儲容器,所述文件包括多個文件分片,所述存儲設備包括:[0051]接收模塊,用於接收客戶端發送的第一讀取請求,所述第一讀取請求請求的待讀數據是所述文件的一部分;[0052]讀取模塊,用於從所述緩存中讀取所述待讀數據中位於所述緩存中的數據,從所述第一存儲介質中讀取所述待讀數據中沒有位於所述緩存中的數據;[0053]預讀模塊,用於從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,預讀的容器中包含有所述文件的至少一個未讀取文件分片。[0054]可選地,所述預讀模塊用於:[0055]從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器中,包含所述預定量的文件分片的數量大於閾值的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0056]可選地,所述預讀模塊還用於:[0057]在所述預定量的未讀取文件分片中,選擇包含所述未讀取文件分片的數量不大於所述閾值的容器內的所述未讀取文件分片,將選擇出的所述未讀取文件分片預讀出並存儲到所述緩存中。[0058]可選地,所述預讀模塊包括:[0059]第一獲取單元,用於獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;[0060]第二獲取單元,用於在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;[0061]統計單元,用於在獲取到的地址指針指向的文件分片所在的容器中,統計各所述容器被所述預定量的地址指針所指向的次數;[0062]第一預讀單元,用於比較統計的次數是否大於所述閾值,若統計的次數大於所述閾值,則將所述次數大於所述閾值的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0063]可選地,所述預讀模塊用於:[0064]從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0065]可選地,所述預讀模塊包括:[0066]第三獲取單元,用於獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;[0067]第四獲取單元,用於在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;[0068]第二預讀單元,用於將獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0069]可選地,所述預讀模塊用於:[0070]從所述第一存儲介質中,按照預定量的未讀取文件分片所在的容器的序號順序,將至少一個包含所述預定量的文件分片的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0071]可選地,所述預讀模塊包括:[0072]第五獲取單元,用於獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;[0073]第六獲取單元,用於在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;[0074]第三預讀單元,用於按照獲取到的地址指針指向的文件分片所在的容器的序號順序,將至少一個獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。[0075]可選地,所述第六獲取單元用於,[0076]在所述文件的地址指針表中,以所述第一地址指針為起始指針,比較所述地址指針表中所述第一地址指針之後的所有地址指針的數量是否不大於預定量;[0077]若所述第一地址指針之後的所有地址指針的數量大於預定量,則獲取所述第一地址指針之後的所有地址指針,[0078]若所述第一地址指針之後的所有地址指針的數量不大於預定量,則獲取所述預定量的地址指針。[0079]可選地,所述預定量的未讀取文件分片在所述文件中是連續的,且所述預定量的未讀取文件分片在所述文件中,與所述待讀數據對應的文件分片相鄰。[0080]可選地,所述接收模塊接收的所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:[0081]所述接收模塊接收到所述第一讀取請求的時間在預定時間內;[0082]所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;以及;[0083]在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量。[0084]可選地,所述接收模塊接收的所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:[0085]所述接收模塊接收到所述第一讀取請求的時間在預定時間內;[0086]所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;[0087]在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量;以及;[0088]所述第一讀取請求請求的待讀數據對應的文件分片為,在上一次預讀時,所述預定量的未讀取文件分片以外的未讀取文件分片。[0089]可選地,所述讀取模塊還用於,[0090]接收客戶端發送的第二讀取請求,所述第二讀取請求請求的待讀數據是所述文件的一部分;[0091]所述預讀模塊還用於,[0092]從所述緩存中,讀取所述第二讀取請求請求的待讀數據中,位於所述緩存中的數據;從所述第一存儲介質中,讀取所述第二讀取請求請求的待讀數據中,沒有位於所述緩存中的數據。[0093]第三方面,本發明實施例提供了一種文件存儲設備,所述存儲設備用於存儲文件,所述存儲設備包括第一存儲介質和緩存,所述緩存的訪問速度大於所述第一存儲介質的訪問速度,所述第一存儲介質上有多個存儲容器,所述文件包括多個文件分片,所述存儲設備還包括處理器,所述處理器用於:[0094]接收客戶端發送的第一讀取請求,所述第一讀取請求請求的待讀數據是所述文件的一部分;[0095]從所述緩存中讀取所述待讀數據中位於所述緩存中的數據,從所述第一存儲介質中讀取所述待讀數據中沒有位於所述緩存中的數據;[0096]從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,預讀的容器中包含有所述文件的至少一個未讀取文件分片。[0097]可選地,所述處理器用於,[0098]從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器中,包含所述預定量的文件分片的數量大於閾值的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0099]可選地,所述處理器用於,[0100]在所述預定量的未讀取文件分片中,選擇包含所述未讀取文件分片的數量不大於閾值的容器內的所述未讀取文件分片,將選擇出的所述未讀取文件分片預讀出並存儲到所述緩存中。[0101]可選地,所述處理器用於,[0102]獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;[0103]在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;[0104]在獲取到的地址指針指向的文件分片所在的容器中,統計各所述容器被所述預定量的地址指針所指向的次數;[0105]比較統計的次數是否大於所述閾值,若統計的次數大於所述閾值,則將所述次數大於所述閾值的容器內的數據預讀出來。[0106]可選地,所述處理器用於,[0107]從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0108]可選地,所述處理器用於,[0109]獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;[0110]在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;[0111]將獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。[0112]可選地,所述處理器用於,[0113]從所述第一存儲介質中,按照預定量的未讀取文件分片所在的容器的序號順序,將至少一個包含所述預定量的文件分片的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。[0114]可選地,所述處理器用於,[0115]獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;[0116]在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;[0117]按照獲取到的地址指針指向的文件分片所在的容器的序號順序,將至少一個獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。[0118]可選地,所述處理器還用於,[0119]在所述文件的地址指針表中,以所述第一地址指針為起始指針,比較所述地址指針表中所述第一地址指針之後的所有地址指針的數量是否不大於預定量;[0120]若所述第一地址指針之後的所有地址指針的數量大於預定量,則獲取所述第一地址指針之後的所有地址指針,[0121]若所述第一地址指針之後的所有地址指針的數量不大於預定量,則獲取所述預定量的地址指針。[0122]可選地,所述預定量的未讀取文件分片在所述文件中是連續的,且所述預定量的未讀取文件分片在所述文件中,與所述待讀數據對應的文件分片相鄰。[0123]可選地,所述處理器接收的所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:[0124]所述存儲設備接收到所述第一讀取請求的時間在預定時間內;[0125]所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;以及;[0126]在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量。[0127]可選地,所述處理器接收的所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:[0128]所述存儲設備接收到所述第一讀取請求的時間在預定時間內;[0129]所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;[0130]在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量;以及;[0131]所述第一讀取請求請求的待讀數據對應的文件分片為,在上一次預讀時,所述預定量的未讀取文件分片以外的未讀取文件分片。[0132]可選地,所述處理器還用於,[0133]接收客戶端發送的第二讀取請求,所述第二讀取請求請求的待讀數據是所述文件的一部分;[0134]從所述緩存中,讀取所述第二讀取請求請求的待讀數據中,位於所述緩存中的數據;從所述第一存儲介質中,讀取所述第二讀取請求請求的待讀數據中,沒有位於所述緩存中的數據。[0135]第四方面,本發明實施例提供了一種文件讀取系統,所述系統包括:用戶設備和文件存儲設備,所述用戶設備用於接收用戶的原始文件恢復請求,並根據所述原始文件恢復請求產生多個讀取請求;向所述存儲設備發送所述讀取請求;所述存儲設備為前述存儲設備。[0136]應用本發明實施例提供的技術方案後,當存儲設備接收到客戶端發送的第一讀取請求時,將從第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到緩存中,預讀的容器中包含有該文件的至少一個未讀取文件分片;從而使得存儲設備收到客戶端後續發送該文件的讀取請求時,可以直接從緩存中預讀的數據讀取需讀取的數據,從而減少了讀取數據的時間開銷。由於可以不用預讀整個文件的數據到緩存中,因此緩存需要的存儲空間不大,本發明實施例中的緩存可以採用普通的內存,在一些情況下,直接使用存儲系統原有的內存就可以實現,所以本發明實施例不需要額外的硬體開支,節省了硬體成本。【專利附圖】【附圖說明】[0137]為了更清楚地說明本發明實施例中的技術方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對於本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。[0138]圖1是本發明實施例提供的重複數據刪除文件的存儲結構的示意圖;[0139]圖2是本發明實施例提供的一種文件讀取方法的方法流程圖;[0140]圖3是本發明實施例提供的又一種文件讀取方法的方法流程圖;[0141]圖4是本發明實施例提供的地址指針與容器相關聯的示意圖;[0142]圖5是本發明實施例提供的又一種文件讀取方法的方法流程圖;[0143]圖6是本發明實施例提供的又一種文件讀取方法的方法流程圖;[0144]圖7-圖10是本發明實施例提供的一種文件存儲設備的結構示意圖;[0145]圖11是本發明實施例提供的一種文件存儲設備的【具體實施方式】的結構示意圖;[0146]圖12是本發明實施例提供的一種文件讀取系統的結構示意圖。【具體實施方式】[0147]為使本發明的目的、技術方案和優點更加清楚,下面將結合附圖對本發明實施方式作進一步地詳細描述。[0148]本發明實施例提供了一種文件讀取方法,適用於讀取存儲在存儲設備上的文件,尤其適用於讀取存儲在存儲設備上的重刪文件。該存儲設備通常包括第一存儲介質(第一存儲介質包括但不限於磁碟、閃盤和光碟(CompactDisk,簡稱CD))和緩存,該緩存的訪問速度大於該第一存儲介質的訪問速度。第一存儲介質上有多個container(容器),每個container分為多個chunk(數據塊)。一個文件可以被分成多個文件分片,每個文件分片的數據量大小可以不相同,一個chunk中存儲一個文件分片。一個container中含有的一個文件的文件分片的數量,也被稱為這個container的引用計數(referencecount)。舉例來說,假設一個文件A共由100個文件分片組成,這100個文件分片分散在第一存儲介質的3個container中,3個container中,含有這個文件A的文件分片的數量分別為20、30和50,那麼這3個container的引用計數就是20、30和50。需要說明的是,除了文件A的文件分片,這3個container還可以含有其他文件的文件分片。本發明實施例中,訪問速度可以是從存儲介質上讀取數據的速度,存儲介質是緩存或者第一存儲介質。[0149]在本發明實施例中,存儲設備採用的文件系統包括但不限於Linux文件系統和Windows文件系統。為便於對本發明實施例提供的技術方案的理解,本發明實施例將以Linux文件系統下的重刪文件為例對技術方案進行具體描述。[0150]首先對Linux文件系統下的重刪文件的存儲結構進行介紹。重刪文件包括兩部分內容,inode(索引節點)和container。inode存儲在文件系統維護的inodetable(索引節點列表)中。每創建一個重刪文件,文件系統將為該重刪文件分配一個inode。Inode用於記錄重刪文件本身的meta-1nformation(元信息)(例如文件大小和創建時間)。每個container是一個指定大小(例如9M)的存儲空間,每個container被分為多個chunk。一個chunk的大小可以為4?12K。[0151]參見圖1,inode和container之間存在關聯:meta_information包括用於指向該重刪文件的各個文件分片的若干地址指針eptr。eptr通常包括直接型和間接型兩種。直接型eptr直接指向chunk,間接型eptr指向的是其他eptr。一個直接型eptr決定兩個參數,一個是chunk的序號,另一個則是container的序號。隨著重刪文件的增多,文件分片呈海量級增長,越來越多的重刪文件將引用之前重刪文件的文件分片。這樣,當前存儲的重刪文件中一些eptr將會指向之前存儲的重刪文件的eptr。[0152]需要說明的是,由於一個chunk存儲一個文件分片,所以在本發明實施例中,eptr指向的文件分片,是指存儲在eptr指向的chunk中存儲的文件分片。[0153]實施例一[0154]本發明實施例提供了一種文件讀取方法,適用於讀取存儲在存儲設備上的文件。參見圖2,該方法流程包括:[0155]步驟101:存儲設備接收Client(客戶端)發送的第一讀取請求,該第一讀取請求請求的數據稱為待讀數據,待讀數據是文件的一部分。對文件的讀取可以分多次完成也可以一次完成,當分多次完成時,每次發送一個讀取請求,請求讀取文件的一部分,第一讀取請求為這些請求中的一個。[0156]其中,該存儲設備包括第一存儲介質和緩存,該緩存的訪問速度大於第一存儲介質的訪問速度,該第一存儲介質上有多個container。該文件包括多個文件分片,組成這個文件的文件分片全部存儲在第一存儲介質中,或者部分存儲在第一存儲介質中部分存儲在緩存中,或者全部存儲在緩存中。[0157]具體地,第一存儲介質包括但不限於磁碟、閃盤和⑶。緩存包括但不限於內存,內存可以包括隨機存儲器(RandomAccessMemory,簡稱RAM)和只讀存儲器(ReadOnlyMemory,簡稱ROM)。[0158]具體地,該第一讀取請求可以包括文件的名稱、待讀數據的起始位置、以及待讀數據的數據量。待讀數據的數據量為該文件的整體數據量的一部分,一部分可以不是整個文件的,也可以是整個文件。[0159]具體地,該讀取請求請求的待讀數據,是從該第一讀取請求中的待讀數據的起始位置對應的數據開始的指定量的數據,該指定量等於該讀取請求中的待讀數據的數據量。指定量例如可以是64KByte或128KByte大小的數據量。[0160]步驟102:從緩存中讀取屬於待讀數據中位於緩存中的數據,從第一存儲介質中讀取待讀數據中沒有位於緩存中的數據。[0161]本實施例中,可以先讀取位於緩存中的數據,再讀取位於第一存儲介質中的數據。如果所有待讀數據都在緩存中,則從第一存儲介質中讀取的數據量是0;如果緩存中不存在待讀數據,那麼從緩存中讀取的數據量是O。[0162]步驟103:從第一存儲介質中預讀至少一個container的數據,並將預讀出的數據存儲到緩存中,預讀的container中包含有該文件的至少一個未讀取文件分片。預讀到的數據可以用container的形式存儲在緩存中。[0163]具體地,未讀取文件分片是,該文件中,除當前讀取請求請求的待讀數據對應的文件分片、以及在當前讀取請求之前已讀取的文件分片之外的文件分片。[0164]使用本發明實施例提供的上述方法,當存儲設備接收到客戶端發送的第一讀取請求時,將從第一存儲介質中預讀至少一個container的數據,並將預讀出的數據存儲到緩存中,預讀的container中包含有該文件的至少一個未讀取文件分片;從而使得存儲設備收到客戶端後續發送該文件的讀取請求時,可以直接從緩存中預讀的數據讀取需讀取的數據,從而減少了讀取數據的時間開銷。由於可以不用預讀整個文件的數據到緩存中,因此緩存需要的存儲空間不大,本發明實施例中的緩存可以採用普通的內存,在一些情況下,直接使用存儲系統原有的內存就可以實現,所以本發明實施例不需要額外的硬體開支,節省了硬體成本。[0165]實施例二[0166]本實施例以重刪文件為例,來詳細說明本發明提供的一種文件讀取方法。下面先簡單介紹一下本發明實施例的應用場景,但並不以此為限,本發明實施例適用於任何需要讀取重刪文件的場景。重刪文件通常用於備份,是某個原始文件的備份文件,重刪文件的內容與其對應的原始文件的至少大部分內容相同。在對原始文件進行備份的過程中,會建立重刪文件和被備份的原始文件之間的對應關係。[0167]假設原始文件發生損毀,用戶打算讀取備份的重刪文件來恢復原始文件。這時,用戶通過滑鼠點擊或觸屏等交互方式啟動客戶端(例如某備份應用)的用戶界面,並在用戶界面的引導下,向客戶端提交原始文件的恢復請求,該恢復請求包括原始文件的名稱。該客戶端根據該原始文件的恢復請求,從存儲設備(例如伺服器)獲取與該原始文件對應的重刪文件的數據。具體地,客戶端可以安裝在用戶設備上,例如移動電腦。客戶端還可以安裝在該存儲設備上,例如伺服器。[0168]在此場景下,本發明實施例提供了一種文件的讀取方法,參見圖3,該方法流程包括:[0169]步驟201:客戶端接收用戶的原始文件恢復請求,並根據該原始文件恢復請求產生多個讀取請求。[0170]具體地,該讀取請求包括重刪文件的名稱、待讀數據的起始位置、以及待讀數據的數據量。一個讀取請求中的待讀數據的數據量為該重刪文件的整體數據量的一部分。在具體實現中,待讀數據的起始位置可以用文件的偏移量表示。這多個讀取請求都是針對同一重刪文件的,也就是說,這些讀取請求中的重刪文件的名稱相同。[0171]客戶端接收該恢復請求後,先在原始文件與重刪文件的對應關係(備份時建立)中,查詢該原始文件對應的重刪文件,並獲取查詢出的重刪文件的大小。然後,生成多個讀取請求。每個讀取請求請求的待讀數據的數據量可以根據實際情況由用戶配置,通常不超過文件讀取協議支持的最大數據量。[0172]如前所述,一個重刪文件可以被分成多個文件分片。由於重刪文件中包含的數據具有一定的順序,因此,重刪文件被分成的多個文件分片是連續的。[0173]一個讀取請求請求的待讀數據可以包括一個或多個文件分片。具體地,一個讀取請求請求的待讀數據可以是至少一個文件分片包含的全部數據,或者,一個讀取請求請求的待讀數據可以是至少一個文件分片包含的全部數據、以及至少一個文件分片包含的部分數據。若一個讀取請求請求的待讀數據對應的文件分片的數量為2個以上,則該2個以上的文件分片是連續的。例如,假設一個重刪文件被分成F個文件分片,其中一個讀取請求的待讀數據對應的文件分片為第i個文件分片至第i+j個文件分片。該讀取請求的待讀數據可以是第i個文件分片至第i+j個文件分片的全部數據;或者可以是第i個文件分片的後半部分數據、以及第i+1個文件分片至第i+j個文件分片的全部數據;或者可以是第i+j個文件分片的前半部分數據、以及第i+1個文件分片至第i+j_l個文件分片的全部數據;或者可以是第i個文件分片的後半部分數據和第i+j個文件分片的前半部分數據、以及第i+1個文件分片至第i+j-1個文件分片的全部數據,其中,1、j均為自然數,j>i。本發明實施例中的連續是指這些文件分片在文件中的關係。也就是說一個文件可以拆分成多個文件分片,這些文件分片之間具有先後次序。這些文件分片,按照這個連續的先後次序可以重新拼裝成被拆分的文件。[0174]步驟202:客戶端向存儲設備發送讀取請求,該讀取請求請求的待讀數據是該文件的一部分。[0175]具體地,通過生成多個讀取請求,可以將一個重刪文件的讀取過程分成多個讀取過程,每個讀取過程讀取重刪文件的部分數據,所有讀取請求所請求的數據共同組成原始文件的數據。每個讀取過程中,客戶端通過文件讀取協議向存儲設備提交一次讀取請求。[0176]在本發明實施例中,假設客戶端將一個重刪文件的讀取過程分成了Z個讀取過程,該Z個讀取過程向存儲設備提交的讀取請求依次為第1次、第2次、…、第Z-1次、以及第Z次讀取請求。[0177]步驟203:存儲設備接收客戶端發送的讀取請求,該讀取請求請求的待讀數據是該文件的一部分。[0178]步驟204:存儲設備從緩存中讀取該待讀數據中位於緩存中的數據,從第一存儲介質中讀取該待讀數據中沒有位於緩存中的數據。[0179]存儲設備從緩存中讀取該待讀數據中位於緩存中的數據,從第一存儲介質中讀取該待讀數據中沒有位於緩存中的數據,可以包括:若緩存中存在該讀取請求請求的全部待讀數據,則存儲設備從緩存中讀取全部待讀數據;若緩存中存在部分待讀數據,還有一部分數據不存在緩存中,則存儲設備從緩存中讀取該部分待讀數據,從第一存儲介質中讀取剩餘待讀數據;若緩存中不存在任何該待讀數據,則存儲設備從第一存儲介質中讀取全部待讀數據。比如,若在步驟203中,收到的是該重刪文件的第1次讀取請求,此時緩存中不存在任何eptr相對應的文件分片,在這種情況下,存儲設備會從第一存儲介質中,讀取出全部待讀數據對應的eptr指向的文件分片,並返回待讀數據給客戶端。若在步驟203中,收到的是該重刪文件的非第1次讀取請求,緩存中可能存在當前讀取請求請求的待讀數據的部分或全部。[0180]其中,存儲設備從緩存中讀取(全部或部分)待讀數據,包括:首先,存儲設備獲取全部待讀數據對應的eptr。具體地,根據該重刪文件的名稱,在inodetable中查詢該重刪文件的inode。並在該重刪文件的inode指示的eptr表中,根據待讀數據的位置與eptr之間的對應關係,從待讀數據的起始位置對應的eptr開始,順序獲取一定數據量的eptr。在eptr表中eptr的排列順序,與文件分片在文件中的順序相同,並且eptr與文件分片的數量相同,印tr與文件分片一一對應。然後,存儲設備在預先建立的eptr與緩存中存儲的文件分片的對應關係中,查詢是否存在與獲取的eptr相對應的文件分片。若緩存中存在全部eptr相對應的文件分片,貝U從緩存中讀取全部待讀數據;若緩存中存在部分eptr相對應的文件分片,則從緩存中讀取部分待讀數據。值得說明的是,eptr與緩存中存儲的文件分片的對應關係的建立過程,請參見步驟208。[0181]步驟205:當該讀取請求為第一讀取請求時,執行步驟206;當該讀取請求為第二讀取請求時,退出本次流程。[0182]其中,第一讀取請求為滿足預讀觸發條件的讀取請求,第二讀取請求為除第一讀取請求以外的針對該重刪文件的讀取請求。也就是說,第一讀取請求會觸發預讀過程(詳見步驟207),而第二讀取請求不會觸發預讀過程。[0183]具體地,預讀觸發條件的內容詳見本實施例下文。[0184]步驟206:存儲設備判斷讀取的待讀數據中最後一個文件分片是否為文件的最後一個文件分片;若是,則退出本次流程,若否,則執行步驟207。[0185]具體地,存儲設備判斷讀取的待讀數據中最後一個文件分片是否為重刪文件的最後一個文件分片,包括:首先,獲取第一eptr,該第一eptr指向讀取的待讀數據中最後一個文件分片。其次,獲取該重刪文件的inode指示的eptr表中最後一個eptr。然後,比較第一eptr和eptr表中最後一個eptr。若兩者一致,則判定讀取的待讀數據中最後一個文件分片為重刪文件的最後一個文件分片,即該重刪文件已被讀取完畢,退出本次流程。若兩者不同,則執行步驟207。[0186]步驟207:從第一存儲介質中預讀至少一個container的數據,並將預讀出的數據存儲到緩存中,預讀的container中包含有該文件的至少一個未讀取文件分片。[0187]本步驟207可以包括:存儲設備從第一存儲介質中,把預定量的未讀取文件分片所在的container中,包含預定量的文件分片的數量大於閾值的container內的數據預讀出來,並將預讀出的數據存儲到緩存中。例如閾值為50,則本步驟把含有預定量的文件分片的數量超過50的container預讀到緩存中。[0188]其中,預定量的未讀取文件分片在該文件中是連續的,且預定量的未讀取文件分片在文件中,與該待讀數據對應的文件分片相鄰。預定量的未讀取文件分片可以是餘下總的未讀文件分片。也可以是其中的一部分,當預定量的未讀取文件分片是總的未讀文件分片的一部分時,可以用數量或者數據量大小來表示,例如1000個未讀文件分片,或者10GBytes的未讀文件分片。[0189]本步驟207可以包括如下步驟:[0190]步驟2071:獲取第一eptr,該第一eptr指向待讀數據對應的文件分片中的最後一個文件分片。[0191]參見圖4,假設獲取的第一eptr為N。[0192]步驟2072:在文件的eptr表中,獲取第一eptr之後的預定量的eptr。[0193]具體地,印tr描述了重刪文件的文件分片存儲在第一存儲介質上哪一個container中哪一個chunk,也就是說,知道eptr,就能夠確定文件分片的存儲地址。[0194]其中,本步驟2072包括:在重刪文件的eptr表中,以該第一eptr為起始指針,比較eptr表中第一eptr之後的所有eptr的數量是否不大於預定量,若是,則獲取第一eptr之後的所有eptr,若否,則獲取預定量的eptr。[0195]具體地,eptr表與inode關聯。該eptr表為文件系統分配給重刪文件的。eptr表存儲在文件系統指定的存儲空間。由於eptr表中每個eptr指向一個文件分片,文件分片是連續的,因此,eptr表中eptr也是連續的,eptr之間的先後順序與重刪文件中文件分片之間的先後順序一致。[0196]其中,該預定量可以是該重刪文件的所有未讀取文件分片的總數據量,也可以是該重刪文件的未讀取文件分片的總數據量的一部分,該預定量為預先設置的定值,例如可以為50MBytes。該預定量的印tr指向的文件分片的數據量,可以不小於前一次重刪文件讀取的數據量,這樣能夠保證緩存中存儲的數據量可以滿足下一次重刪文件的讀取請求請求的數據量。一個文件分片的大小一般為4KBytes~12KBytes,那麼一個文件分片的大小平均為8KBytes,即一個eptr指向的數據量平均為8KBytes。具體地,獲取指向讀取的數據中最後一個文件分片的eptr後,將該eptr作為第一eptr,並以該第一eptr為起始指針,獲取第一eptr之後的預定量的eptr。參見圖4,假設獲取的所有印tr分別為N、N+1、N+2、???、N+Xo[0197]步驟2073:在獲取到的eptr指向的文件分片所在的container中,統計各container被預定量的eptr所指向的次數,也就是預定量的文件分片被container所包含的數量。[0198]具體地,每一個container可以為9MBytes。為實現變長分塊,每一個文件分片的大小在4K至12K之間,也就是說,對於重刪文件來說每一個直接型eptr指向的文件分片大小平均為8K。當指向的文件分片位於同一個container的eptr的數量約為9M/8K的時候,則表示該container中所有文件分片基本都被該重刪文件所引用。但是,隨著備份量逐漸增加,有一些container可能被該重刪文件引用的的次數非常少,即只有少量的eptr指向這些container。例如,假設指向的文件分片位於container的序號為M』+1的eptr只有I個,即M,+1被eptr所指向的次數為I。[0199]步驟2074:比較統計的次數是否大於閾值,若統計的次數大於閾值,則將次數大於該閾值的container內的數據預讀出來。`[0200]其中,該預置閾值為預先設置的定值,例如5。當container被預定量的eptr所指向的次數大於5時,則將該container內的數據預讀出來。[0201]將次數大於該閾值的container內的數據預讀出來,可以包括:按照存儲的預定量中的未讀取文件分片的數量從多到少的順序,將次數大於該閾值的container內的數據預讀出來。[0202]當container的被指次數低於預置閾值時,可以將該container中的未讀取文件分片單獨預讀出並存儲到緩存中。相較於將整個container中所有文件分片讀取出來,更節約緩存空間。[0203]步驟2075:將預讀出的數據存儲到緩存中。[0204]步驟2076:在預定量的未讀取文件分片中,選擇包含該未讀取文件分片的數量不大於閾值的container內的未讀取文件分片,將選擇出的未讀取文件分片預讀出並存儲到緩存中。[0205]步驟208:建立印tr與緩存中存儲的文件分片的對應關係。[0206]另外,將預讀出的數據存儲至緩存後,建立步驟2072中獲取的預定量的eptr與緩存中文件分片的對應關係。該對應關係可以用列表的形式進行存儲。該對應關係便於存儲設備通過eptr能夠獲取緩存中數據。[0207]可以重複執行上述步驟203?208,直至將整個重刪文件讀出並返回給客戶端,重刪文件就是客戶端請求的文件,與原始文件相同。在本實施例中,需要重複上述步驟Z-1次才能將整個重刪文件返回給客戶端。[0208]在本實施例中,預讀觸發條件可以包括以下條件中的一種或多種:第一種,存儲設備接收到讀取請求的時間在預定時間內;第二種,緩存中不存在該讀取請求請求的待讀數據,或者該讀取請求請求的待讀數據中的一部分不存在緩存中;第三種,在存儲設備讀取出該讀取請求請求的待讀數據後,緩存中未被讀取的、屬於該文件的文件分片的數量小於預設量;第四種,該讀取請求請求的待讀數據對應的文件分片為,在上一次預讀時,預定量的未讀取文件分片以外的未讀取文件分片。[0209]假設當前採用的預讀觸發條件為上述第二種,那麼,在該步驟中,當該讀取請求為重刪文件的第I次讀取請求時,緩存中將不存在該讀取請求請求的待讀數據,那麼,該讀取請求滿足預讀觸發條件,該讀取請求為第一讀取請求。[0210]假設當前採用的預讀觸發條件包括上述第二種和第三種觸發條件,那麼,針對第三種觸發條件,在一個重刪文件的某次預讀過程之後,隨著該重刪文件的連續的讀取請求的增加,緩存中數據將越來越多的被讀取。因此,可以為存放在緩存中未被讀取的文件分片設置一個數據量閾值。當未被讀取的文件分片的數據量小於該閾值時,將進行下一輪的預讀操作。[0211]獲取緩存中未被讀取的文件分片的數據量可以包括,首先,在從緩存中讀取出待讀數據時,將讀取的文件分片標記出來。然後,統計緩存中未被標記的文件分片的數據量,即為緩存中未被讀取的文件分片的數據量。[0212]針對第四種觸發條件,參見實施例二中步驟207描述的預讀過程,若當前讀取請求請求的待讀數據對應的文件分片包括,在當前讀取請求的上一次預讀過程中,所確定的預定量的未讀取文件分片,則意味著,當前讀取請求請求的待讀數據可能已經預讀出,因此可以不必再次觸發預讀。反之,若當前讀取請求請求的待讀數據對應的文件分片為,在當前讀取請求的上一次預讀過程中,所確定的預定量的未讀取文件分片之外的未讀取分片,則意味著,當前讀取請求請求的待讀數據未被預讀過,因此可以觸發預讀過程,便於當前讀取請求的後續請求從緩存中讀取預讀數據,提高讀取性能。[0213]本發明實施例提供的上述方法的可以達到有益效果是:當存儲設備接收到客戶端發送的第一讀取請求時,將從第一存儲介質中預讀至少一個container的數據,並將預讀出的數據存儲到緩存中,預讀的container中包含有該文件的至少一個未讀取文件分片;從而使得存儲設備收到客戶端後續發送該文件的讀取請求時,可以直接從緩存中預讀的數據讀取需讀取的數據,從而減少了讀取數據的時間開銷。由於可以不用預讀整個文件的數據到緩存中,因此緩存需要的存儲空間不大,所以本發明實施例中的緩存可以採用普通的內存,在一些情況下,直接使用存儲系統原有的內存就可以實現,所以本發明實施例不需要額外的硬體開支,節省了硬體成本。[0214]此外,在本發明實施例中,預讀的至少一個container的數據包括,預定量的未讀取文件分片所在的container中,包含預定量的未讀取文件分片的數量大於閾值的container內的數據。例如,若預定量為280,閾值為50,280個文件分片分別布置在8個container中,這8個container分別包含的屬於280個文件分片內的文件分片數量分別為20、25、25、30、30、43、52、以及55。預讀的至少一個container的數據包括,包含的屬於280個文件分片內的文件分片數量分別為52和55的container內的所有數據。由於在預讀前,統計了各個container中存儲的屬於預定量的未讀取文件分片中文件分片的數量,當數量大於預置閾值時,才將container讀取出來,因此,可以避免讀取過多的沒有用到的數據,並且可以進一步減小從第一存儲介質讀取數據的次數,提高了文件的讀取性能。[0215]實施例三[0216]本發明實施例提供了一種文件讀取方法。本實施例與本發明實施例二不同之處在於,(一)從第一存儲介質預讀至少一個container的數據的方式不同,(二)預讀觸發條件不同。參見圖5,該方法流程包括:[0217]步驟301:客戶端接收用戶的原始文件恢復請求,並根據該原始文件恢復請求產生多個讀取請求。[0218]本步驟301同實施例二中步驟201,在此不再詳述。[0219]步驟302:客戶端向存儲設備發送讀取請求,該讀取請求請求的待讀數據是該文件的一部分。[0220]本步驟302同實施例二中步驟202,在此不再詳述。[0221]步驟303:存儲設備接收客戶端發送的讀取請求,該讀取請求請求的待讀數據是該文件的一部分。[0222]本步驟303同實施例二中步驟203,在此不再詳述。[0223]步驟304:存儲設備從緩存中讀取該待讀數據中位於緩存中的數據,從第一存儲介質中讀取該待讀數據中沒有位於緩存中的數據。[0224]本步驟304同實施例二中步驟204,在此不再詳述。[0225]步驟305:當該讀取請求為第一讀取請求時,執行步驟306;當該讀取請求為第二讀取請求時,退出本次流程。[0226]在本實施例中,預讀觸發條件可以包括以下條件中的一種或多種:第一種,存儲設備接收到讀取請求的時間在預定時間內,第二種,緩存中不存在該讀取請求請求的待讀數據,或者該讀取請求請求的待讀數據中的一部分不存在緩存中,第三種,在存儲設備讀取出該讀取請求請求的待讀數據後,緩存中未被讀取的文件分片的數量小於預設量。[0227]該三種觸發條件同實施例二中描述的前三種觸發條件,在此不再詳述。[0228]步驟306:存儲設備判斷讀取的待讀數據中最後一個文件分片是否為文件的最後一個文件分片;若是,則退出本次流程,若否,則執行步驟307。[0229]本步驟306同實施例二中步驟206,在此不再詳述。[0230]步驟307:從第一存儲介質中預讀至少一個container的數據,並將預讀出的數據存儲到緩存中,預讀的container中包含有該文件的至少一個未讀取文件分片。[0231]本步驟307可以包括:存儲設備從第一存儲介質中,把預定量的未讀取文件分片所在的container內的數據預讀出來,並將預讀出的數據存儲到緩存中。其中,預定量的未讀取文件分片在該文件中是連續的,且預定量的未讀取文件分片在文件中,與該待讀數據對應的文件分片相鄰。在該文件中是連續的,是指這些文件分片之間存在順序,按照這個順序把這些分片拼接在一起,可以恢復成這個文件。[0232]本步驟307可以包括如下步驟:[0233]步驟3071:獲取第一eptr,該第一eptr指向待讀數據對應的文件分片中的最後一個文件分片。[0234]本步驟3071同實施例二中步驟2071,在此不再詳述。[0235]步驟3072:在文件的eptr表中,獲取第一eptr之後的預定量的eptr。[0236]本步驟3072同實施例二中步驟2072,在此不再詳述。[0237]步驟3073:將獲取到的eptr指向的文件分片所在的container內的數據預讀出來。[0238]具體地,如前所述,eptr描述了重刪文件的文件分片是第一存儲介質上哪一個container中哪一個chunk。根據獲取的預定量的eptr,能夠得到該預定量的eptr指向的文件分片各自所在的container的序號,將container內的數據預讀出來。[0239]步驟3074:將預讀出的數據存儲到緩存中。[0240]本步驟3074同實施例二中步驟2075,在此不再詳述。[0241]步驟308:建立eptr與緩存中存儲的文件分片的對應關係。[0242]本步驟308同實施例二中步驟208,在此不再詳述。[0243]重複執行上述步驟303?308,直至將整個重刪文件讀出並返回給客戶端。[0244]本發明實施例提供的上述方法的有益效果是:當存儲設備接收到客戶端發送的第一讀取請求時,將從第一存儲介質中預讀至少一個container的數據,並將預讀出的數據存儲到緩存中,預讀的container中包含有該文件的至少一個未讀取文件分片;從而使得存儲設備收到客戶端後續發送該文件的讀取請求時,可以直接從緩存中預讀的數據讀取需讀取的數據,從而減少了讀取數據的時間開銷。由於可以不用預讀整個文件的數據到緩存中,因此緩存需要的存儲空間不大,本發明實施例中的緩存可以採用普通的內存,在一些情況下,直接使用存儲系統原有的內存就可以實現,所以本發明實施例不需要額外的硬體開支,節省了硬體成本。[0245]實施例四[0246]本發明實施例提供了一種文件讀取方法。本實施例與本發明實施例二或三不同之處在於,從第一存儲介質預讀至少一個container的數據的方式不同。參見圖6,該方法流程包括:[0247]步驟401:客戶端接收用戶的原始文件恢復請求,並根據該原始文件恢復請求產生多個讀取請求。每個讀取請求所請求的數據是原始文件數據的一部分,這多個請求所請求的數據可以共同組成原始文件。[0248]本步驟401同實施例三中步驟301,在此不再詳述。後續步驟以某一個讀取請求為例進行具體介紹。[0249]步驟402:客戶端向存儲設備發送一個讀取請求,該讀取請求請求的待讀數據是該文件的一部分。[0250]本步驟402同實施例三中步驟302,在此不再詳述。[0251]步驟403:存儲設備接收客戶端發送的讀取請求,該讀取請求請求的待讀數據是該文件的一部分。[0252]本步驟403同實施例三中步驟303,在此不再詳述。[0253]步驟404:存儲設備從緩存中讀取該待讀數據中位於緩存中的數據,從第一存儲介質中讀取該待讀數據中沒有位於緩存中的數據。[0254]本步驟404同實施例三中步驟304,在此不再詳述。[0255]步驟405:當該讀取請求為第一讀取請求時,執行步驟406;當該讀取請求為第二讀取請求時,退出本次流程。[0256]本步驟405同實施例三中步驟305,在此不再詳述。[0257]步驟406:存儲設備判斷讀取的待讀數據中最後一個文件分片是否為文件的最後一個文件分片;若是,則退出本次流程,若否,則執行步驟407。[0258]本步驟406同實施例三中步驟306,在此不再詳述。[0259]步驟407:從第一存儲介質中預讀至少一個container的數據,並將預讀出的數據存儲到緩存中,預讀的container中包含有該文件的至少一個未讀取文件分片。[0260]本步驟407可以包括:存儲設備從第一存儲介質中,按照預定量的未讀取文件分片所在的container的序號順序,將至少一個包含該預定量的文件分片的容器內的數據預讀出來,並將預讀出的數據存儲到緩存中。[0261]其中,預定量的未讀取文件分片在該文件中是連續的,且預定量的未讀取文件分片在文件中,與該待讀數據對應的文件分片相鄰。在該文件中是連續的,是指這些文件分片之間存在順序,按照這個順序把這些分片拼接在一起,可以恢復成這個文件。[0262]本步驟407可以包括如下步驟:[0263]步驟4071:獲取第一eptr,該第一eptr指向待讀數據對應的文件分片中的最後一個文件分片。[0264]本步驟4071同實施例三中步驟3071,在此不再詳述。[0265]步驟4072:在文件的eptr表中,獲取第一eptr之後的預定量的eptr。[0266]本步驟4072同實施例三中步驟3072,在此不再詳述。[0267]步驟4073:按照獲取到的eptr指向的文件分片所在的container的序號順序,將至少一個獲取到的eptr指向的文件分片所在的container內的數據預讀出來。[0268]具體地,根據獲取的預定量的eptr,能夠得到該預定量的eptr指向的文件分片各自所在的container的序號。所有container是按照container的序號的先後順序分布在第一存儲介質上的。container的序號可以為container在第一存儲介質上的初始存儲地址至終止存儲地址的地址區間。參見圖4,假設N指向的container的序號為M+2,N+1指向的container的序號為M+l,N+2指向的container的序號為M+2,N+x指向的container的序號為M+y。所有container的序號順序如下表I所示。[0269]表I[0270]【權利要求】1.一種文件讀取方法,適用於讀取存儲在存儲設備上的文件,所述存儲設備包括第一存儲介質和緩存,所述緩存的訪問速度大於所述第一存儲介質的訪問速度,所述第一存儲介質上有多個容器,所述文件包括多個文件分片,其特徵在於,所述方法包括:所述存儲設備接收客戶端發送的第一讀取請求,所述第一讀取請求請求的待讀數據是所述文件的一部分;從所述緩存中讀取所述待讀數據中位於所述緩存中的數據,從所述第一存儲介質中讀取所述待讀數據中沒有位於所述緩存中的數據;從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,預讀的容器中包含有所述文件的至少一個未讀取文件分片。2.根據權利要求1所述的方法,其特徵在於,所述從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,包括:從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器中,包含所述預定量的文件分片的數量大於閾值的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。3.根據權利要求2所述的方法,其特徵在於,所述方法還包括:在所述預定量的未讀取文件分片中,選擇包含所述未讀取文件分片的數量不大於所述閾值的容器內的所述未讀取文件分片,將選擇出的所述未讀取文件分片預讀出並存儲到所述緩存中。4.根據權利要求2或3所述的方法,其特徵在於,所述從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器中,包含所述未讀取文件分片的數量大於閾值的容器內的數據預讀出來,包括:獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;在獲取到的地址指針指向的文件分片所在的容器中,統計各所述容器被所述預定量的地址指針所指向的次數;比較統計的次數是否大於所述閾值,若統計的次數大於所述閾值,則將所述次數大於所述閾值的容器內的數據預讀出來。5.根據權利要求1所述的方法,其特徵在於,所述從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,包括:從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。6.根據權利要求5所述的方法,其特徵在於,所述從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器內的數據預讀出來,包括:獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;將獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。7.根據權利要求1所述的方法,其特徵在於,所述從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,包括:從所述第一存儲介質中,按照預定量的未讀取文件分片所在的容器的序號順序,將至少一個包含所述預定量的文件分片的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。8.根據權利要求7所述的方法,其特徵在於,所述從所述第一存儲介質中,按照預定量的未讀取文件分片所在的容器的序號順序,將至少一個包含所述預定量的文件分片的容器內的數據預讀出來,包括:獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;按照獲取到的地址指針指向的文件分片所在的容器的序號順序,將至少一個獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。9.根據權利要求4、6或8所述的方法,其特徵在於,所述在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針,包括:在所述文件的地址指針表中,以所述第一地址指針為起始指針,比較所述地址指針表中所述第一地址指針之後的所有地址指針的數量是否不大於預定量;若所述第一地址指針之後的所有地址指針的數量大於預定量,則獲取所述第一地址指針之後的所有地址指針,若所述第一地址指針之後的所有地址指針的數量不大於預定量,則獲取所述預定量的地址指針。10.根據權利要求2、5或7所述的方法,其特徵在於,所述預定量的未讀取文件分片在所述文件中是連續的,且所述預定量的未讀取文件分片在所述文件中,與所述待讀數據對應的文件分片相鄰。11.根據權利要求1-10任一項所述的方法,其特徵在於,所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:所述存儲設備接收到所述第一讀取請求的時間在預定時間內;所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;以及;在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量。12.根據權利要求2-10任一項所述的方法,其特徵在於,所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:所述存儲設備接收到所述第一讀取請求的時間在預定時間內;所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量;以及;所述第一讀取請求請求的待讀數據對應的文件分片為,在上一次預讀時,所述預定量的未讀取文件分片以外的未讀取文件分片。13.根據權利要求1-12任一項所述的方法,其特徵在於,所述方法還包括:所述存儲設備接收客戶端發送的第二讀取請求,所述第二讀取請求請求的待讀數據是所述文件的一部分;從所述緩存中,讀取所述第二讀取請求請求的待讀數據中,位於所述緩存中的數據;從所述第一存儲介質中,讀取所述第二讀取請求請求的待讀數據中,沒有位於所述緩存中的數據。14.一種文件存儲設備,所述存儲設備用於存儲文件,所述存儲設備包括第一存儲介質和緩存,所述緩存的訪問速度大於所述第一存儲介質的訪問速度,所述第一存儲介質上有多個容器,所述文件包括多個文件分片,其特徵在於,所述存儲設備包括:接收模塊,用於接收客戶端發送的第一讀取請求,所述第一讀取請求請求的待讀數據是所述文件的一部分;讀取模塊,用於從所述緩存中讀取所述待讀數據中位於所述緩存中的數據,從所述第一存儲介質中讀取所述待讀數據中沒有位於所述緩存中的數據;預讀模塊,用於從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,預讀的容器中包含有所述文件的至少一個未讀取文件分片。15.根據權利要求14所述的存儲設備,其特徵在於,所述預讀模塊用於:從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器中,包含所述預定量的文件分片的數量大於閾值的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。16.根據權利要求15所述的存儲設備,其特徵在於,所述預讀模塊還用於:在所述預定量的未讀取文件分片中,選擇包含所述未讀取文件分片的數量不大於所述閾值的容器內的所述未讀取文件分片,將選擇出的所述未讀取文件分片預讀出並存儲到所述緩存中。17.根據權利要求15或16所述的存儲設備,其特徵在於,所述預讀模塊包括:第一獲取單元,用於獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;第二獲取單元,用於在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;統計單元,用於在獲取到的地址指針指向的文件分片所在的容器中,統計各所述容器被所述預定量的地址指針所指向的次數;第一預讀單元,用於比較統計的次數是否大於所述閾值,若統計的次數大於所述閾值,則將所述次數大於所述閾值的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。18.根據權利要求14所述的存儲設備,其特徵在於,所述預讀模塊用於:從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。19.根據權利要求18所述的存儲設備,其特徵在於,所述預讀模塊包括:第三獲取單元,用於獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;第四獲取單元,用於在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;第二預讀單元,用於將獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。20.根據權利要求14所述的存儲設備,其特徵在於,所述預讀模塊用於:從所述第一存儲介質中,按照預定量的未讀取文件分片所在的容器的序號順序,將至少一個包含所述預定量的文件分片的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。21.根據權利要求20所述的存儲設備,其特徵在於,所述預讀模塊包括:第五獲取單元,用於獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;第六獲取單元,用於在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;第三預讀單元,用於按照獲取到的地址指針指向的文件分片所在的容器的序號順序,將至少一個獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。22.根據權利要求21所述的存儲設備,其特徵在於,所述第六獲取單元用於,在所述文件的地址指針表中,以所述第一地址指針為起始指針,比較所述地址指針表中所述第一地址指針之後的所有地址指針的數量是否不大於預定量;若所述第一地址指針之後的所有地址指針的數量大於預定量,則獲取所述第一地址指針之後的所有地址指針,若所述第一地址指針之後的所有地址指針的數量不大於預定量,則獲取所述預定量的地址指針。23.根據權利要求15、18或20所述的存儲設備,其特徵在於,所述預定量的未讀取文件分片在所述文件中是連續的,且所述預定量的未讀取文件分片在所述文件中,與所述待讀數據對應的文件分片相鄰。24.根據權利要求14-23任一項所述的存儲設備,其特徵在於,所述接收模塊接收的所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:所述接收模塊接收到所述第一讀取請求的時間在預定時間內;所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;以及;在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量。25.根據權利要求15-23任一項所述的存儲設備,其特徵在於,所述接收模塊接收的所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:所述接收模塊接收到所述第一讀取請求的時間在預定時間內;所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量;以及;所述第一讀取請求請求的待讀數據對應的文件分片為,在上一次預讀時,所述預定量的未讀取文件分片以外的未讀取文件分片。26.根據權利要求14-25任一項所述的存儲設備,其特徵在於,所述讀取模塊還用於,接收客戶端發送的第二讀取請求,所述第二讀取請求請求的待讀數據是所述文件的一部分;所述預讀模塊還用於,從所述緩存中,讀取所述第二讀取請求請求的待讀數據中,位於所述緩存中的數據;從所述第一存儲介質中,讀取所述第二讀取請求請求的待讀數據中,沒有位於所述緩存中的數據。27.一種文件存儲設備,所述存儲設備用於存儲文件,所述存儲設備包括第一存儲介質和緩存,所述緩存的訪問速度大於所述第一存儲介質的訪問速度,所述第一存儲介質上有多個容器,所述文件包括多個文件分片,其特徵在於,所述存儲設備還包括處理器,所述處理器用於:接收客戶端發送的第一讀取請求,所述第一讀取請求請求的待讀數據是所述文件的一部分;從所述緩存中讀取所述待讀數據中位於所述緩存中的數據,從所述第一存儲介質中讀取所述待讀數據中沒有位於所述緩存中的數據;從所述第一存儲介質中預讀至少一個容器的數據,並將預讀出的數據存儲到所述緩存中,預讀的容器中包含有所述文件的至少一個未讀取文件分片。28.根據權利要求27`所述的存儲設備,其特徵在於,所述處理器用於,從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器中,包含所述預定量的文件分片的數量大於閾值的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。29.根據權利要求28所述的存儲設備,其特徵在於,所述處理器用於,在所述預定量的未讀取文件分片中,選擇包含所述未讀取文件分片的數量不大於所述閾值的容器內的所述未讀取文件分片,將選擇出的所述未讀取文件分片預讀出並存儲到所述緩存中。30.根據權利要求28或29所述的存儲設備,其特徵在於,所述處理器用於,獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;在獲取到的地址指針指向的文件分片所在的容器中,統計各所述容器被所述預定量的地址指針所指向的次數;比較統計的次數是否大於所述閾值,若統計的次數大於所述閾值,則將所述次數大於所述閾值的容器內的數據預讀出來。31.根據權利要求27所述的存儲設備,其特徵在於,所述處理器用於,從所述第一存儲介質中,把預定量的未讀取文件分片所在的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。32.根據權利要求31所述的存儲設備,其特徵在於,所述處理器用於,獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;將獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。33.根據權利要求27所述的存儲設備,其特徵在於,所述處理器用於,從所述第一存儲介質中,按照預定量的未讀取文件分片所在的容器的序號順序,將至少一個包含所述預定量的文件分片的容器內的數據預讀出來,並將預讀出的數據存儲到所述緩存中。34.根據權利要求33所述的存儲設備,其特徵在於,所述處理器用於,獲取第一地址指針,所述第一地址指針指向所述待讀數據對應的文件分片中的最後一個文件分片;在所述文件的地址指針表中,獲取所述第一地址指針之後的預定量的地址指針;按照獲取到的地址指針指向的文件分片所在的容器的序號順序,將至少一個獲取到的地址指針指向的文件分片所在的容器內的數據預讀出來。35.根據權利要求30、32或34所述的存儲設備,其特徵在於,所述處理器還用於,在所述文件的地址指針表中,以所述第一地址指針為起始指針,比較所述地址指針表中所述第一地址指針之後的所有地址指針的數量是否不大於預定量;若所述第一地址指針之後的所有地址指針的數量大於預定量,則獲取所述第一地址指針之後的所有地址指針,若所述第一地址指針之後的所有地址指針的數量不大於預定量,則獲取所述預定量的地址指針。36.根據權利要求28、31或33所述的存儲設備,其特徵在於,所述預定量的未讀取文件分片在所述文件中是連續的,且所述預定量的未讀取文件分片在所述文件中,與所述待讀數據對應的文件分片相鄰。37.根據權利要求27-36任一項所述的存儲設備,其特徵在於,所述處理器接收的所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:所述存儲設備接收到所述第一讀取請求的時間在預定時間內;所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;以及;在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量。38.根據權利要求28-36任一項所述的存儲設備,其特徵在於,所述處理器接收的所述第一讀取請求為滿足預讀觸發條件的讀取請求,所述預讀觸發條件包括以下條件中的一種或多種:所述存儲設備接收到所述第一讀取請求的時間在預定時間內;所述緩存中不存在所述第一讀取請求請求的待讀數據,或者所述第一讀取請求請求的待讀數據中的一部分不存在所述緩存中;在所述存儲設備讀取出所述第一讀取請求請求的待讀數據後,所述緩存中未被讀取的、屬於所述文件的文件分片的數量小於預設量;以及;所述第一讀取請求請求的待讀數據對應的文件分片為,在上一次預讀時,所述預定量的未讀取文件分片以外的未讀取文件分片。39.根據權利要求27-38任一項所述的存儲設備,其特徵在於,所述處理器還用於,接收客戶端發送的第二讀取請求,所述第二讀取請求請求的待讀數據是所述文件的一部分;從所述緩存中,讀取所述第二讀取請求請求的待讀數據中,位於所述緩存中的數據;從所述第一存儲介質中,讀取所述第二讀取請求請求的待讀數據中,沒有位於所述緩存中的數據。40.一種文件讀取系統,其特徵在於,所述系統包括:用戶設備和文件存儲設備,所述用戶設備用於接收用戶的原始文件恢復請求,並根據所述原始文件恢復請求產生多個讀取請求;向所述存儲設備發送所述讀取請求;所述存儲設備為如權利要求14-39任一項所述的存儲設備。【文檔編號】G06F12/08GK103608785SQ201380000771【公開日】2014年2月26日申請日期:2013年6月21日優先權日:2013年6月21日【發明者】吳劍申請人:華為技術有限公司