本發(fā)明總體上涉及數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域,特別是涉及一種分段寫入的數(shù)據(jù)存儲(chǔ)方法、裝置和系統(tǒng)以及便攜式電子設(shè)備。
背景技術(shù):
目前最常見的文件下載方式是并發(fā)多段及斷點(diǎn)續(xù)傳,即下載時(shí)將文件分成多段數(shù)據(jù),每段數(shù)據(jù)分別以一個(gè)獨(dú)立的線程下載,且同時(shí)運(yùn)行多個(gè)下載線程。當(dāng)某個(gè)時(shí)間點(diǎn)下載任務(wù)暫停,此時(shí)下載的位置就是斷點(diǎn),當(dāng)此未完成的下載任務(wù)再次開始時(shí),會(huì)從此斷點(diǎn)繼續(xù)傳送。并發(fā)多段及斷點(diǎn)續(xù)傳能夠避免重復(fù)下載,充分利用網(wǎng)絡(luò)帶寬,由此提高下載速度。
然而,隨著諸如智能手機(jī)的便攜式移動(dòng)設(shè)備的普及,給傳統(tǒng)的并發(fā)多段方案帶來了新的挑戰(zhàn)。這是因?yàn)?,并發(fā)多段下載方案需要跳轉(zhuǎn)式地寫文件,文件越大,通常需要跳轉(zhuǎn)的距離越大(例如,在均分算法的情況下)。而相比于網(wǎng)速的快速提升,目前的便攜式移動(dòng)設(shè)備上的存儲(chǔ)介質(zhì)(例如,安全數(shù)字存儲(chǔ)卡,即sd卡)讀寫速度慢,而且部分文件系統(tǒng)(例如,文件配置表系統(tǒng),即fat文件系統(tǒng))不能快讀創(chuàng)建大文件,即不支持快讀跳轉(zhuǎn)到指定的位置進(jìn)行讀寫。結(jié)果是,緩存中的下載數(shù)據(jù)不能及時(shí)寫入存儲(chǔ)介質(zhì)中,也不能從網(wǎng)絡(luò)端下載新數(shù)據(jù),從而造成下載卡頓的現(xiàn)象。
為了提高下載寫文件性能,避免大距離跳轉(zhuǎn)寫數(shù)據(jù)到文件,現(xiàn)有技術(shù)中提出了使用類似于磁盤整理的臟數(shù)據(jù)位置調(diào)整算法進(jìn)行數(shù)據(jù)存儲(chǔ)。臟數(shù)據(jù)是指不在匹配的位置寫入文件的數(shù)據(jù)。這種方案在數(shù)據(jù)存儲(chǔ)過程中均衡地增加數(shù)據(jù)文件的大小由此減少跳轉(zhuǎn)距離,將數(shù)據(jù)文件中的臟數(shù)據(jù)讀出到內(nèi)存中,使用適當(dāng)?shù)膬?nèi)存消耗換取寫文件速度的提升。具體地,參照?qǐng)D1簡要描述該方案。
圖1所示的數(shù)據(jù)存儲(chǔ)方法100中,數(shù)據(jù)下載時(shí)首先獲取待存儲(chǔ)數(shù)據(jù)塊,然后判斷存儲(chǔ)介質(zhì)上是否有足夠的存儲(chǔ)空間(步驟s110)。如果存儲(chǔ)空間不足,則暫停下載任務(wù)(步驟s120)。如果存儲(chǔ)空間足夠,則執(zhí)行步驟s130 將要寫入的數(shù)據(jù)塊放到內(nèi)存中的待寫入隊(duì)列中。接下來處理該待寫入隊(duì)列的隊(duì)首數(shù)據(jù):判斷隊(duì)首數(shù)據(jù)在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置是否被臟數(shù)據(jù)占用(步驟s140)。如果該目標(biāo)存儲(chǔ)位置沒有被臟數(shù)據(jù)占用,則執(zhí)行步驟s150將該隊(duì)首數(shù)據(jù)直接寫入該目標(biāo)存儲(chǔ)位置。如果該目標(biāo)存儲(chǔ)位置被臟數(shù)據(jù)占用,則執(zhí)行步驟s160將占用該目標(biāo)存儲(chǔ)位置的臟數(shù)據(jù)作為待存儲(chǔ)數(shù)據(jù)讀出到內(nèi)存中的待寫入隊(duì)列,例如添加到待寫入隊(duì)列的隊(duì)尾。此時(shí),該目標(biāo)存儲(chǔ)位置為空,然后執(zhí)行步驟s150將隊(duì)首數(shù)據(jù)寫入目標(biāo)存儲(chǔ)位置。接下來判斷待寫入隊(duì)列是否為空(步驟s170),如果該寫入隊(duì)列中已經(jīng)沒有待存儲(chǔ)數(shù)據(jù)塊,則執(zhí)行步驟s180,將數(shù)據(jù)文件中的臟數(shù)據(jù)記錄寫入臟數(shù)據(jù)記錄文件。如果該待寫入隊(duì)列中還有要待存儲(chǔ)數(shù)據(jù)塊,則繼續(xù)處理該待寫入隊(duì)列的隊(duì)首數(shù)據(jù),即,繼續(xù)執(zhí)行步驟s140,直到待寫入隊(duì)列為空。待寫入隊(duì)列中的待存儲(chǔ)數(shù)據(jù)塊全部寫入到數(shù)據(jù)文件之后,再將臟數(shù)據(jù)記錄寫入臟數(shù)據(jù)記錄文件,這樣完成了數(shù)據(jù)存儲(chǔ)。
圖2示意性地示出了圖1中描述的數(shù)據(jù)存儲(chǔ)方法的一個(gè)實(shí)例。參考圖2,已經(jīng)創(chuàng)建了包括四個(gè)存儲(chǔ)位置的數(shù)據(jù)文件,其中第一個(gè)和第三個(gè)存儲(chǔ)位置被臟數(shù)據(jù)p和q占用,第二個(gè)和第四個(gè)位置空閑。待寫入隊(duì)列包括待存儲(chǔ)數(shù)據(jù)塊m和n。臟數(shù)據(jù)記錄文件包括臟數(shù)據(jù)p和q的記錄。第一至第四存儲(chǔ)位置分別是數(shù)據(jù)塊m、n、p和q的目標(biāo)存儲(chǔ)位置。首先處理數(shù)據(jù)塊m,m在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置被臟數(shù)據(jù)p占用,因此將臟數(shù)據(jù)p讀出到待寫入隊(duì)列的隊(duì)尾,然后將待存儲(chǔ)數(shù)據(jù)塊m寫入數(shù)據(jù)文件的第一個(gè)存儲(chǔ)位置。此時(shí),待寫入隊(duì)列包括待存儲(chǔ)數(shù)據(jù)塊n和p。按照同樣的方法,將待存儲(chǔ)數(shù)據(jù)塊n和p依次寫入數(shù)據(jù)文件中的對(duì)應(yīng)目標(biāo)存儲(chǔ)位置,參見圖2。然后,更新臟數(shù)據(jù)記錄文件,刪除臟數(shù)據(jù)p和q的記錄。
上述方法在數(shù)據(jù)存儲(chǔ)時(shí)寫兩個(gè)文件,即,數(shù)據(jù)文件和臟數(shù)據(jù)記錄文件。只有在數(shù)據(jù)文件中的臟數(shù)據(jù)與臟數(shù)據(jù)記錄文件中的臟數(shù)據(jù)記錄完全匹配(下文中簡稱臟數(shù)據(jù)一致,若兩者不一致則稱臟數(shù)據(jù)不一致)時(shí),才能正確解析數(shù)據(jù)文件的結(jié)構(gòu)。而臟數(shù)據(jù)不一致時(shí),會(huì)導(dǎo)致數(shù)據(jù)文件結(jié)構(gòu)信息錯(cuò)亂,從而數(shù)據(jù)存儲(chǔ)完成后無法有效打開。在文件下載過程中,由于外部原因?qū)е麓疟P空間變化、寫入位置跳躍導(dǎo)致實(shí)際消耗空間大于數(shù)據(jù)本身以及處理臟數(shù)據(jù)節(jié)點(diǎn)等原因,寫入數(shù)據(jù)文件和寫入臟數(shù)據(jù)記錄文件有可能因?yàn)榇疟P空間不足而寫入失敗。將數(shù)據(jù)放到待寫入隊(duì)列前的空間檢查并不能保 證避免這種寫入失敗。寫入失敗會(huì)導(dǎo)致臟數(shù)據(jù)不一致,盡管用戶騰出足夠空間后可以繼續(xù)下載,但下載完的文件不完整而無法打開,大大降低了下載效率。
在圖1和圖2中所示的數(shù)據(jù)存儲(chǔ)方法100中,臟數(shù)據(jù)被不斷地讀出到內(nèi)存并添加到待寫入隊(duì)列。在這種狀態(tài)下,臟數(shù)據(jù)在臟數(shù)據(jù)記錄文件中存在,而在數(shù)據(jù)文件中不存在。此時(shí),如果發(fā)生磁盤空間不足,則臟數(shù)據(jù)無法寫回?cái)?shù)據(jù)文件,將導(dǎo)致臟數(shù)據(jù)記錄文件與數(shù)據(jù)文件中的臟數(shù)據(jù)不一致。另一方面,數(shù)據(jù)文件中的臟數(shù)據(jù)發(fā)生變化后,需要及時(shí)把臟數(shù)據(jù)記錄寫入記錄文件。如果臟數(shù)據(jù)記錄文件過大,也會(huì)導(dǎo)致出現(xiàn)磁盤空間不足的情況使得臟數(shù)據(jù)記錄無法寫入,從而造成臟數(shù)據(jù)不一致。
因而,需要一種能夠避免因磁盤空間不足而導(dǎo)致臟數(shù)據(jù)不一致的數(shù)據(jù)存儲(chǔ)方法與裝置。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的一個(gè)目的在于有效避免數(shù)據(jù)下載過程中因磁盤空間不足而導(dǎo)致臟數(shù)據(jù)不一致的情況發(fā)生,保證下載的數(shù)據(jù)文件能夠有效打開。
為此,本發(fā)明的數(shù)據(jù)存儲(chǔ)方法、裝置和系統(tǒng),通過在磁盤空間創(chuàng)建預(yù)定大小的臟數(shù)據(jù)記錄文件且在整個(gè)下載過程中保持其大小不變,解決臟數(shù)據(jù)記錄文件下載過程中需要增長的問題,由此避免臟數(shù)據(jù)記錄文件寫入失敗。進(jìn)一步,本發(fā)明通過臟數(shù)據(jù)遞歸優(yōu)先寫入,解決臟數(shù)據(jù)無法寫回?cái)?shù)據(jù)文件的問題,由此避免臟數(shù)據(jù)只存在內(nèi)存中的不穩(wěn)定狀態(tài)。即使磁盤空間滿導(dǎo)致數(shù)據(jù)文件寫入失敗時(shí),只需將新的臟數(shù)據(jù)記錄寫回臟數(shù)據(jù)記錄文件,就可以避免出現(xiàn)臟數(shù)據(jù)不一致。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種數(shù)據(jù)存儲(chǔ)方法。該數(shù)據(jù)存儲(chǔ)方法包括以下步驟:創(chuàng)建預(yù)定大小的臟數(shù)據(jù)記錄文件;確定待寫入隊(duì)列的隊(duì)首數(shù)據(jù)在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置;在確定所述目標(biāo)存儲(chǔ)位置已被臟數(shù)據(jù)占用的情況下,將與該臟數(shù)據(jù)相對(duì)應(yīng)的臟數(shù)據(jù)記錄插入到所述待寫入隊(duì)列并作為新的隊(duì)首數(shù)據(jù);以及更新所述臟數(shù)據(jù)記錄文件。利用本方法,使得數(shù)據(jù)文件中的臟數(shù)據(jù)與臟數(shù)據(jù)記錄文件中的臟數(shù)據(jù)記錄始終保持一致,降低了寫文件失敗率。
在一個(gè)實(shí)施例中,所述數(shù)據(jù)存儲(chǔ)方法還包括步驟:在確定所述目標(biāo)存 儲(chǔ)位置未被臟數(shù)據(jù)占用的情況下,基于所述隊(duì)首數(shù)據(jù)在所述目標(biāo)存儲(chǔ)位置進(jìn)行寫入。
在進(jìn)一步的實(shí)施例中,所述基于所述隊(duì)首數(shù)據(jù)在所述目標(biāo)存儲(chǔ)位置進(jìn)行寫入的步驟包括:判斷所述隊(duì)首數(shù)據(jù)是否為臟數(shù)據(jù)記錄;若判定所述隊(duì)首數(shù)據(jù)不是臟數(shù)據(jù)記錄,則將所述隊(duì)首數(shù)據(jù)寫入到所述數(shù)據(jù)文件中的所述目標(biāo)存儲(chǔ)位置;以及若判定所述隊(duì)首數(shù)據(jù)是臟數(shù)據(jù)記錄,則從所述數(shù)據(jù)文件中讀出與所述臟數(shù)據(jù)記錄相對(duì)應(yīng)的臟數(shù)據(jù),并將該臟數(shù)據(jù)寫入到所述數(shù)據(jù)文件中的所述目標(biāo)存儲(chǔ)位置。
在一個(gè)實(shí)施例中,所述隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置是所述數(shù)據(jù)文件中與所述隊(duì)首數(shù)據(jù)的存儲(chǔ)位置標(biāo)識(shí)相對(duì)應(yīng)的存儲(chǔ)位置,或者是所述數(shù)據(jù)文件中根據(jù)移動(dòng)位置限制而指定的臨時(shí)存儲(chǔ)位置。
在一個(gè)實(shí)施例中,所述更新所述臟數(shù)據(jù)記錄文件的步驟是在所述數(shù)據(jù)文件中寫入了臟數(shù)據(jù)的情況下執(zhí)行的。
在進(jìn)一步的實(shí)施例中,所述更新所述臟數(shù)據(jù)記錄文件的步驟包括:判斷是否基于所述隊(duì)首數(shù)據(jù)在所述目標(biāo)存儲(chǔ)位置成功地進(jìn)行了寫入;以及若判定在所述目標(biāo)存儲(chǔ)位置成功地進(jìn)行了寫入,則在所述隊(duì)首數(shù)據(jù)是臟數(shù)據(jù)記錄的情況下以及/或者在所述隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置是指定的臨時(shí)存儲(chǔ)位置的情況下,更新所述臟數(shù)據(jù)記錄文件。
在一個(gè)實(shí)施例中,所述數(shù)據(jù)存儲(chǔ)方法還包括如下步驟:檢查對(duì)所述數(shù)據(jù)文件的讀寫處理是否成功,以檢測(cè)是否存在存儲(chǔ)空間不足的情況;和在檢測(cè)到對(duì)所述數(shù)據(jù)文件的讀寫處理不成功的情況下,暫停對(duì)該數(shù)據(jù)文件的數(shù)據(jù)存儲(chǔ)。由此,通過檢查讀寫文件的結(jié)果并確定是否磁盤空間已滿,不但可以及時(shí)中斷后續(xù)的寫入嘗試,同時(shí)還可以省去數(shù)據(jù)放到待寫入隊(duì)列前的空間預(yù)檢查,減少了下載過程中不必要的資源消耗。
在一個(gè)實(shí)施例中,所述臟數(shù)據(jù)記錄文件的預(yù)定大小被設(shè)置為大于或等于數(shù)據(jù)存儲(chǔ)過程中所需的用于存儲(chǔ)臟數(shù)據(jù)記錄的最高存儲(chǔ)空間容量。在進(jìn)一步的實(shí)施例中,所述臟數(shù)據(jù)記錄文件的預(yù)定大小與待存儲(chǔ)的數(shù)據(jù)的大小相關(guān)聯(lián)。
根據(jù)本發(fā)明的另一個(gè)方面,提供了一種數(shù)據(jù)存儲(chǔ)裝置。該數(shù)據(jù)存儲(chǔ)裝置包括:創(chuàng)建模塊,用于創(chuàng)建預(yù)定大小的臟數(shù)據(jù)記錄文件;確定模塊,用于確定待寫入隊(duì)列的隊(duì)首數(shù)據(jù)在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置;插入模塊, 用于在確定所述目標(biāo)存儲(chǔ)位置已被臟數(shù)據(jù)占用的情況下,將與該臟數(shù)據(jù)相對(duì)應(yīng)的臟數(shù)據(jù)記錄插入到所述待寫入隊(duì)列并作為新的隊(duì)首數(shù)據(jù);以及更新模塊,用于更新由所述創(chuàng)建模塊創(chuàng)建的所述臟數(shù)據(jù)記錄文件。
在一個(gè)實(shí)施例中,所述數(shù)據(jù)存儲(chǔ)裝置還包括寫入模塊,用于在確定所述目標(biāo)存儲(chǔ)位置未被臟數(shù)據(jù)占用的情況下,基于所述隊(duì)首數(shù)據(jù)在所述目標(biāo)存儲(chǔ)位置進(jìn)行寫入。
在進(jìn)一步的實(shí)施例中,所述寫入模塊包括:第一判斷單元,用于判斷所述隊(duì)首數(shù)據(jù)是否為臟數(shù)據(jù)記錄;第一寫入單元,用于當(dāng)所述第一判斷單元判定所述隊(duì)首數(shù)據(jù)不是臟數(shù)據(jù)記錄時(shí),將所述隊(duì)首數(shù)據(jù)寫入到所述數(shù)據(jù)文件中的所述目標(biāo)存儲(chǔ)位置;以及第二寫入單元,用于當(dāng)所述第一判斷單元判定所述隊(duì)首數(shù)據(jù)是臟數(shù)據(jù)記錄時(shí),從所述數(shù)據(jù)文件中讀出與所述臟數(shù)據(jù)記錄相對(duì)應(yīng)的臟數(shù)據(jù),并將該臟數(shù)據(jù)寫入到所述數(shù)據(jù)文件中的所述目標(biāo)存儲(chǔ)位置。
在一個(gè)實(shí)施例中,所述隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置是所述數(shù)據(jù)文件中與所述隊(duì)首數(shù)據(jù)的存儲(chǔ)位置標(biāo)識(shí)相對(duì)應(yīng)的存儲(chǔ)位置,或者是所述數(shù)據(jù)文件中根據(jù)移動(dòng)位置限制而指定的臨時(shí)存儲(chǔ)位置。
在一個(gè)實(shí)施例中,所述更新模塊在所述數(shù)據(jù)文件中寫入了臟數(shù)據(jù)的情況下更新所述臟數(shù)據(jù)記錄文件。
在進(jìn)一步的實(shí)施例中,所述更新模塊還包括:第二判斷單元,用于判斷是否基于所述隊(duì)首數(shù)據(jù)在所述目標(biāo)存儲(chǔ)位置成功地進(jìn)行了寫入;以及更新單元,用于當(dāng)所述第二判斷單元判定在所述目標(biāo)存儲(chǔ)位置成功地進(jìn)行了寫入,則在所述隊(duì)首數(shù)據(jù)是臟數(shù)據(jù)記錄的情況下以及/或者在所述隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置是指定的臨時(shí)存儲(chǔ)位置的情況下,更新所述臟數(shù)據(jù)記錄文件。
在一個(gè)實(shí)施例中,所述數(shù)據(jù)存儲(chǔ)裝置還包括:檢查模塊,用于檢查對(duì)所述數(shù)據(jù)文件的讀寫處理是否成功,以檢測(cè)是否存在存儲(chǔ)空間不足的情況;暫停模塊,用于在所述檢查模塊檢測(cè)到對(duì)所述數(shù)據(jù)文件的讀寫處理不成功的情況下,暫停對(duì)該數(shù)據(jù)文件的數(shù)據(jù)存儲(chǔ)。
在一個(gè)實(shí)施例中,所述臟數(shù)據(jù)記錄文件的預(yù)定大小被設(shè)置為大于或等于數(shù)據(jù)存儲(chǔ)過程中所需的用于存儲(chǔ)臟數(shù)據(jù)記錄的最高存儲(chǔ)空間容量。在進(jìn)一步的實(shí)施例中,所述臟數(shù)據(jù)記錄文件的預(yù)定大小與待存儲(chǔ)的數(shù)據(jù)的大小 相關(guān)聯(lián)。
根據(jù)本發(fā)明的又一個(gè)方面,還提供了一種數(shù)據(jù)存儲(chǔ)系統(tǒng)。該數(shù)據(jù)存儲(chǔ)系統(tǒng)包括處理器和與該處理器相連的存儲(chǔ)器。所述處理器配置為:創(chuàng)建預(yù)定大小的臟數(shù)據(jù)記錄文件;確定待寫入隊(duì)列的隊(duì)首數(shù)據(jù)在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置;在確定所述目標(biāo)存儲(chǔ)位置已被臟數(shù)據(jù)占用的情況下,將與該臟數(shù)據(jù)相對(duì)應(yīng)的臟數(shù)據(jù)記錄插入到所述待寫入隊(duì)列并作為新的隊(duì)首數(shù)據(jù);以及更新所述臟數(shù)據(jù)記錄文件。所述數(shù)據(jù)文件和所述臟數(shù)據(jù)記錄文件被配置為存儲(chǔ)在所述存儲(chǔ)器中。
根據(jù)本發(fā)明的還一個(gè)方面,提供了一種包括根據(jù)本發(fā)明上述方面所述的數(shù)據(jù)存儲(chǔ)系統(tǒng)的便攜式電子設(shè)備。
利用本發(fā)明的數(shù)據(jù)存儲(chǔ)方法、裝置和系統(tǒng),解決了因磁盤空間不足而導(dǎo)致數(shù)據(jù)文件和臟數(shù)據(jù)記錄文件寫入失敗的問題,由此避免了出現(xiàn)臟數(shù)據(jù)不一致,從而降低了寫文件失敗率。進(jìn)一步,本發(fā)明用實(shí)際寫文件結(jié)果檢查取代磁盤空間預(yù)檢查,實(shí)現(xiàn)了更準(zhǔn)確高效的空間檢查,節(jié)省了下載過程的資源消耗。
附圖說明
通過結(jié)合附圖對(duì)本公開示例性實(shí)施方式進(jìn)行更詳細(xì)的描述,本公開的上述以及其它目的、特征和優(yōu)勢(shì)將變得更加明顯,其中,在本公開示例性實(shí)施方式中,相同的參考標(biāo)號(hào)通常代表相同部件。
圖1示出了現(xiàn)有技術(shù)中一種數(shù)據(jù)存儲(chǔ)方法的流程圖。
圖2示意性地示出了圖1所示數(shù)據(jù)存儲(chǔ)方法的一個(gè)實(shí)例。
圖3示出了根據(jù)本發(fā)明一實(shí)施例的數(shù)據(jù)存儲(chǔ)方法的總流程圖。
圖4示出了根據(jù)本發(fā)明實(shí)施例的基于隊(duì)首數(shù)據(jù)在目標(biāo)存儲(chǔ)位置進(jìn)行寫入并更新臟數(shù)據(jù)記錄文件的處理的流程圖。
圖5示意性地示出了圖3所示數(shù)據(jù)存儲(chǔ)方法的一個(gè)實(shí)例。
圖6示出了根據(jù)本發(fā)明一實(shí)施例的數(shù)據(jù)存儲(chǔ)裝置的功能框圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開的優(yōu)選實(shí)施方式。雖然附圖中顯示了本公開的優(yōu)選實(shí)施方式,然而應(yīng)該理解,可以以各種形式實(shí)現(xiàn)本公開 而不應(yīng)被這里闡述的實(shí)施方式所限制。相反,提供這些實(shí)施方式是為了使本公開更加透徹和完整,并且能夠?qū)⒈竟_的范圍完整地傳達(dá)給本領(lǐng)域的技術(shù)人員。
如前所述,為了有效避免數(shù)據(jù)下載過程中臟數(shù)據(jù)不一致的情況發(fā)生,保證存儲(chǔ)之后的數(shù)據(jù)文件能夠有效打開,本發(fā)明通過臟數(shù)據(jù)遞歸優(yōu)先寫入以及臟數(shù)據(jù)記錄文件磁盤空間預(yù)分配且持續(xù)持有的方案,來分別解決數(shù)據(jù)文件寫入失敗和臟數(shù)據(jù)記錄文件寫入失敗的問題??梢灾?,本發(fā)明的使用范圍并不僅限于上述介紹的現(xiàn)有技術(shù)中的數(shù)據(jù)存儲(chǔ)方法,其可以廣泛應(yīng)用于涉及臟數(shù)據(jù)位置調(diào)整的數(shù)據(jù)存儲(chǔ)方法。進(jìn)一步,本發(fā)明的核心技術(shù)方案不限于數(shù)據(jù)下載情形,而是可以應(yīng)用于任何涉及分段隨機(jī)寫文件操作的情形。
下面將參照?qǐng)D3至圖6來具體地描述本發(fā)明的實(shí)施例。圖3示出了根據(jù)本發(fā)明一實(shí)施例的數(shù)據(jù)存儲(chǔ)方法200的總體流程圖。在開始下載數(shù)據(jù)之前,首先,在磁盤空間中創(chuàng)建預(yù)定大小的臟數(shù)據(jù)記錄文件(步驟s210)。在一個(gè)實(shí)施例中,臟數(shù)據(jù)記錄文件的預(yù)定大小被設(shè)置為大于或等于數(shù)據(jù)存儲(chǔ)過程中所需的用于存儲(chǔ)臟數(shù)據(jù)記錄的最高存儲(chǔ)空間容量。即,在下載數(shù)據(jù)進(jìn)行存儲(chǔ)的過程中,不需要增加臟數(shù)據(jù)記錄文件的大小。從另一個(gè)角度來說,臟數(shù)據(jù)記錄文件的大小在整個(gè)下載和存儲(chǔ)數(shù)據(jù)的過程中保持不變,由此確保磁盤空間不足不會(huì)影響臟數(shù)據(jù)記錄文件寫入。
在一個(gè)實(shí)施例中,可以根據(jù)待下載并存儲(chǔ)的數(shù)據(jù)的大小來設(shè)置臟數(shù)據(jù)記錄文件的預(yù)定大小。作為一種具體實(shí)現(xiàn),臟數(shù)據(jù)記錄文件的預(yù)定大小可以與待存儲(chǔ)的數(shù)據(jù)大小非線性相關(guān)。例如,當(dāng)下載4g大小的數(shù)據(jù)時(shí),創(chuàng)建20k大小的臟數(shù)據(jù)記錄文件。在一個(gè)實(shí)施例中,在下載過程中更新臟數(shù)據(jù)記錄文件時(shí),可以根據(jù)當(dāng)前臟數(shù)據(jù)記錄的實(shí)際大小,覆蓋更新臟數(shù)據(jù)記錄文件的部分內(nèi)容。例如,假設(shè)臟數(shù)據(jù)記錄的實(shí)際大小為2k,則直接覆蓋更新臟數(shù)據(jù)記錄文件前2k的內(nèi)容,而臟數(shù)據(jù)記錄文件大小始終保持20k。
在開始下載數(shù)據(jù)時(shí),獲取待存儲(chǔ)的數(shù)據(jù)塊,并將其壓入待寫入隊(duì)列。接下來確定待寫入隊(duì)列的隊(duì)首數(shù)據(jù)在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置(步驟s230)。例如,可以提取該隊(duì)首數(shù)據(jù)的存儲(chǔ)位置標(biāo)識(shí),該存儲(chǔ)位置標(biāo)識(shí)標(biāo)明每個(gè)數(shù)據(jù)塊在原文件中的對(duì)應(yīng)位置。
接下來,判斷數(shù)據(jù)文件中隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置是否被臟數(shù)據(jù)占用 (步驟s250)。如果判定該目標(biāo)存儲(chǔ)位置已被臟數(shù)據(jù)占用,則執(zhí)行步驟s270,即,將與該臟數(shù)據(jù)對(duì)應(yīng)的臟數(shù)據(jù)記錄插入到待寫入隊(duì)列并作為新的隊(duì)首數(shù)據(jù)。需要指出的是,與現(xiàn)有技術(shù)的數(shù)據(jù)存儲(chǔ)方法100(參見圖1)不同的是,本發(fā)明中此處并不是將臟數(shù)據(jù)本身插入到待寫入隊(duì)列,而僅將與臟數(shù)據(jù)相對(duì)應(yīng)的臟數(shù)據(jù)記錄讀出到內(nèi)存。此時(shí),待寫入隊(duì)列的隊(duì)首數(shù)據(jù)是相應(yīng)的臟數(shù)據(jù)記錄,而非臟數(shù)據(jù)本身。而且,臟數(shù)據(jù)記錄被插入到待寫入隊(duì)列的隊(duì)首,優(yōu)先被處理。由此,避免了臟數(shù)據(jù)只存在內(nèi)存中的不穩(wěn)定狀態(tài)。
在步驟s270之后,數(shù)據(jù)存儲(chǔ)方法200返回到步驟s230以確定該新的隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置,以及步驟s250來判斷新隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置是否被另一臟數(shù)據(jù)占用。需要說明的是,在一個(gè)實(shí)施例中,隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置可以是數(shù)據(jù)文件中與該隊(duì)首數(shù)據(jù)的存儲(chǔ)位置標(biāo)識(shí)相對(duì)應(yīng)的存儲(chǔ)位置,也可以是數(shù)據(jù)文件中根據(jù)移動(dòng)位置限制而指定的臨時(shí)存儲(chǔ)位置。例如,如果與待處理的臟數(shù)據(jù)的存儲(chǔ)位置標(biāo)識(shí)相對(duì)應(yīng)的存儲(chǔ)位置距離該臟數(shù)據(jù)的當(dāng)前存儲(chǔ)位置超過移動(dòng)位置限制,則可以將當(dāng)前隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置設(shè)置為移動(dòng)位置限制內(nèi)的某個(gè)位置。在一個(gè)實(shí)施例中,移動(dòng)位置限制與卡頓時(shí)間限值(例如,1秒)和/或數(shù)據(jù)文件的擴(kuò)展速度相關(guān)聯(lián)。
循環(huán)執(zhí)行步驟s230、s250和s270,直到在步驟s250判定待寫入文件的隊(duì)首數(shù)據(jù)在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置未被臟數(shù)據(jù)占用為止。如圖3所示,然后流程進(jìn)行到步驟s280,基于隊(duì)首數(shù)據(jù)在目標(biāo)存儲(chǔ)位置進(jìn)行寫入,然后在數(shù)據(jù)文件中寫入了臟數(shù)據(jù)的情況下更新臟數(shù)據(jù)記錄文件(步驟s290)。至此,數(shù)據(jù)存儲(chǔ)方法200結(jié)束。
如前所述,圖3所示的數(shù)據(jù)存儲(chǔ)方法200,通過臟數(shù)據(jù)遞歸優(yōu)先寫入以及臟數(shù)據(jù)記錄文件磁盤空間預(yù)分配且持續(xù)持有的方案,使得數(shù)據(jù)文件中的臟數(shù)據(jù)與臟數(shù)據(jù)記錄文件中的臟數(shù)據(jù)記錄始終保持一致,保證下載的數(shù)據(jù)文件能夠有效打開,降低了下載失敗率。
下面,參照?qǐng)D4來描述圖3中寫入步驟s280和更新步驟s290的一種具體實(shí)施方式300。處理300從步驟s281開始,即,判斷隊(duì)首數(shù)據(jù)是否為臟數(shù)據(jù)記錄。如果判定隊(duì)首數(shù)據(jù)不是臟數(shù)據(jù)記錄,則將該隊(duì)首數(shù)據(jù)寫入到數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置(步驟s282)。而如果判定隊(duì)首數(shù)據(jù)是臟數(shù)據(jù)記錄,則流程進(jìn)行到步驟s283,即,將數(shù)據(jù)文件中與該臟數(shù)據(jù)記錄對(duì)應(yīng)的 臟數(shù)據(jù)讀出到內(nèi)存。然后,可以將讀出的臟數(shù)據(jù)寫入到數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置(步驟s282)。
為了防止磁盤空間不足(例如,sd卡被移除)導(dǎo)致出現(xiàn)臟數(shù)據(jù)不一致,優(yōu)選地,在步驟s283讀取對(duì)應(yīng)的臟數(shù)據(jù)之后,執(zhí)行判斷該臟數(shù)據(jù)是否讀出成功的步驟(s284),如圖4所示。在判定臟數(shù)據(jù)讀出成功的情況下,執(zhí)行步驟s282,將臟數(shù)據(jù)寫入到數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置。如果判定臟數(shù)據(jù)讀出失敗,則強(qiáng)制結(jié)束對(duì)數(shù)據(jù)文件的當(dāng)前寫入操作。
優(yōu)選地,在步驟s282對(duì)數(shù)據(jù)文件進(jìn)行寫入之后,判斷對(duì)數(shù)據(jù)文件的寫入是否成功(步驟s291)。如果判定寫入失敗,則強(qiáng)制結(jié)束對(duì)數(shù)據(jù)文件的當(dāng)前寫入操作。如果步驟s291判定寫入成功,則可以檢查待寫入隊(duì)列是否為空(步驟s292)。如果待寫入隊(duì)列中仍有未寫入數(shù)據(jù)文件的數(shù)據(jù)塊,則繼續(xù)處理該待寫入隊(duì)列的隊(duì)首數(shù)據(jù),即,返回到圖3中的步驟s230,直至待寫入隊(duì)列為空。在待寫入隊(duì)列為空時(shí),開始更新臟數(shù)據(jù)記錄文件的操作。具體地,如圖4所示,判斷隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置是否與其存儲(chǔ)位置標(biāo)識(shí)相對(duì)應(yīng),即,判斷該目標(biāo)存儲(chǔ)位置是否是根據(jù)移動(dòng)位置限制而指定的臨時(shí)存儲(chǔ)位置(步驟s293)。若判定是臨時(shí)存儲(chǔ)位置,意味著產(chǎn)生了新的臟數(shù)據(jù)記錄節(jié)點(diǎn),由此更新臟數(shù)據(jù)記錄文件(步驟s295)。若在步驟s293處判定目標(biāo)存儲(chǔ)位置不是臨時(shí)存儲(chǔ)位置,在隊(duì)首數(shù)據(jù)是臟數(shù)據(jù)記錄的情況下(步驟s294中的“是”分支),依然會(huì)出現(xiàn)需要?jiǎng)h除臟數(shù)據(jù)記錄節(jié)點(diǎn)的情形,由此更新臟數(shù)據(jù)記錄文件(步驟s295)。
在待存儲(chǔ)數(shù)據(jù)塊全部寫入數(shù)據(jù)文件之后更新臟數(shù)據(jù)記錄文件,保證臟數(shù)據(jù)記錄文件與數(shù)據(jù)文件中的臟數(shù)據(jù)一致。就算下載過程中發(fā)生磁盤空間不足,也只需要及時(shí)將臟數(shù)據(jù)記錄寫回臟數(shù)據(jù)記錄文件就可以保持臟數(shù)據(jù)一致。在解決了磁盤空間不足的問題之后,將臟數(shù)據(jù)記錄中的記錄讀入到待寫入隊(duì)列中,即可繼續(xù)順利進(jìn)行數(shù)據(jù)下載。
在一個(gè)實(shí)施例中,在步驟s295之后,如圖4所示,檢查對(duì)數(shù)據(jù)文件的讀寫處理是否成功(步驟s296),以檢測(cè)是否存在存儲(chǔ)空間不足的情況。在讀寫失敗的情況下,可以根據(jù)返回的錯(cuò)誤碼來確定失敗的原因,由此可以檢測(cè)是否出現(xiàn)了磁盤空間不足。如果判定對(duì)數(shù)據(jù)文件的讀寫處理失敗,則暫停對(duì)數(shù)據(jù)文件的數(shù)據(jù)存儲(chǔ)(步驟s297)。這樣,可以及時(shí)中斷后續(xù)的寫入嘗試。而且與現(xiàn)有技術(shù)相比,省去數(shù)據(jù)放到待寫入隊(duì)列前的空間預(yù)檢 查,減少了下載過程中不必要的資源消耗。
下面仍以圖2中給出的實(shí)例來描述本發(fā)明的臟數(shù)據(jù)遞歸優(yōu)先存儲(chǔ)處理。參見圖5,數(shù)據(jù)文件的四個(gè)存儲(chǔ)位置中的第一個(gè)和第三個(gè)依然被臟數(shù)據(jù)p和q占用,第二和第四存儲(chǔ)位置空閑。待寫入隊(duì)列包括待存儲(chǔ)數(shù)據(jù)塊m和n。第一至第四存儲(chǔ)位置分別是數(shù)據(jù)塊m、n、p和q的目標(biāo)存儲(chǔ)位置。首先,處理待寫入隊(duì)列的隊(duì)首數(shù)據(jù),即待存儲(chǔ)數(shù)據(jù)塊m。此時(shí)數(shù)據(jù)塊m在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置(第一存儲(chǔ)位置)被臟數(shù)據(jù)p占用,因此將與臟數(shù)據(jù)p對(duì)應(yīng)的臟數(shù)據(jù)記錄p’插入到待寫入隊(duì)列的隊(duì)首并作為新的隊(duì)首數(shù)據(jù)。此時(shí),待寫入隊(duì)列包括三個(gè)元素,即(p’,m,n)。
接下來繼續(xù)處理待寫入隊(duì)列的隊(duì)首數(shù)據(jù),即臟數(shù)據(jù)記錄p’。與臟數(shù)據(jù)記錄p’指向的臟數(shù)據(jù)p相對(duì)應(yīng)的目標(biāo)存儲(chǔ)位置為第三存儲(chǔ)位置。而此時(shí)第三存儲(chǔ)位置被臟數(shù)據(jù)q占用。因此,將與臟數(shù)據(jù)q對(duì)應(yīng)的臟數(shù)據(jù)記錄q’插入到待寫入隊(duì)列作為新的隊(duì)首數(shù)據(jù)?,F(xiàn)在的待寫入隊(duì)列包括四個(gè)元素,即(q’,p’,m,n)。對(duì)隊(duì)首數(shù)據(jù)q’進(jìn)行處理,與q’指向的臟數(shù)據(jù)q相對(duì)應(yīng)的目標(biāo)存儲(chǔ)位置為第四存儲(chǔ)位置,該位置空閑,因此先從數(shù)據(jù)文件中將臟數(shù)據(jù)q讀出并將其寫入到第四存儲(chǔ)位置。接下去,類似地將臟數(shù)據(jù)p從第一存儲(chǔ)位置讀出并寫入到第三存儲(chǔ)位置。然后再將待存儲(chǔ)數(shù)據(jù)塊m和n依次寫入數(shù)據(jù)文件的對(duì)應(yīng)目標(biāo)存儲(chǔ)位置??梢姡盟镜呐K數(shù)據(jù)遞歸優(yōu)先寫入方案,能夠保證所有臟數(shù)據(jù)都被寫入數(shù)據(jù)文件,避免出現(xiàn)臟數(shù)據(jù)不一致的情況。
圖6示出了根據(jù)本發(fā)明一實(shí)施例的數(shù)據(jù)存儲(chǔ)裝置400的功能框圖。用于有效防止臟數(shù)據(jù)不一致的數(shù)據(jù)存儲(chǔ)裝置400的功能模塊可以由實(shí)現(xiàn)本發(fā)明原理的硬件、軟件或硬件和軟件的結(jié)合來實(shí)現(xiàn)。本領(lǐng)域技術(shù)人員可以理解的是,圖6中所描述的功能模塊可以組合起來或者劃分成子模塊,從而實(shí)現(xiàn)上述發(fā)明的原理。因此,本文的描述可以支持對(duì)本文描述的功能模塊的任何可能的組合、或者劃分、或者更進(jìn)一步的限定。
參照?qǐng)D6,為了有效防止臟數(shù)據(jù)不一致,數(shù)據(jù)存儲(chǔ)裝置400被配置為包括創(chuàng)建模塊410、確定模塊420、插入模塊430、臟數(shù)據(jù)占用判斷模塊440、寫入模塊450和更新模塊460。
在開始下載數(shù)據(jù)之前,創(chuàng)建模塊410可以創(chuàng)建預(yù)定大小的臟數(shù)據(jù)記錄文件。在一個(gè)實(shí)施例中,臟數(shù)據(jù)記錄文件的預(yù)定大小被設(shè)置為大于或等于 數(shù)據(jù)存儲(chǔ)過程中所需的用于存儲(chǔ)臟數(shù)據(jù)記錄的最高存儲(chǔ)空間容量。即,在下載數(shù)據(jù)進(jìn)行存儲(chǔ)的過程中,不需要增加臟數(shù)據(jù)記錄文件的大小。從另一個(gè)角度來說,臟數(shù)據(jù)記錄文件的大小在整個(gè)下載和存儲(chǔ)數(shù)據(jù)的過程中保持不變,由此確保磁盤空間不足不會(huì)影響臟數(shù)據(jù)記錄文件寫入。在一個(gè)實(shí)施例中,可以根據(jù)待下載并存儲(chǔ)的數(shù)據(jù)的大小來設(shè)置臟數(shù)據(jù)記錄文件的預(yù)定大小。例如,臟數(shù)據(jù)記錄文件的預(yù)定大小可以與待存儲(chǔ)的數(shù)據(jù)大小非線性相關(guān)。在一個(gè)實(shí)施例中,在下載過程中更新臟數(shù)據(jù)記錄文件時(shí),可以根據(jù)當(dāng)前臟數(shù)據(jù)記錄的實(shí)際大小,覆蓋更新臟數(shù)據(jù)記錄文件的部分內(nèi)容。
確定模塊420被配置為確定待寫入隊(duì)列的隊(duì)首數(shù)據(jù)在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置。例如,可以提取該隊(duì)首數(shù)據(jù)的存儲(chǔ)位置標(biāo)識(shí),該存儲(chǔ)位置標(biāo)識(shí)標(biāo)明每個(gè)數(shù)據(jù)塊在原文件中的對(duì)應(yīng)位置。
需要說明的是,在一個(gè)實(shí)施例中,隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置可以是數(shù)據(jù)文件中與該隊(duì)首數(shù)據(jù)的存儲(chǔ)位置標(biāo)識(shí)相對(duì)應(yīng)的存儲(chǔ)位置,也可以是數(shù)據(jù)文件中根據(jù)移動(dòng)位置限制而指定的臨時(shí)存儲(chǔ)位置。例如,如果與待處理的臟數(shù)據(jù)的存儲(chǔ)位置標(biāo)識(shí)相對(duì)應(yīng)的存儲(chǔ)位置距離該臟數(shù)據(jù)的當(dāng)前存儲(chǔ)位置超過移動(dòng)位置限制,則可以將當(dāng)前隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置設(shè)置為移動(dòng)位置限制內(nèi)的某個(gè)位置。在一個(gè)實(shí)施例中,移動(dòng)位置限制與卡頓時(shí)間限值(例如,1秒)和/或數(shù)據(jù)文件的擴(kuò)展速度相關(guān)聯(lián)。
當(dāng)確定模塊420已經(jīng)確定了隊(duì)首數(shù)據(jù)在數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置之后,臟數(shù)據(jù)占用判斷模塊440判斷該目標(biāo)存儲(chǔ)位置是否已被臟數(shù)據(jù)占用。插入模塊430被配置為當(dāng)臟數(shù)據(jù)占用判斷模塊440判定該目標(biāo)存儲(chǔ)位置已被臟數(shù)據(jù)占用時(shí),將與該臟數(shù)據(jù)相對(duì)應(yīng)的臟數(shù)據(jù)記錄插入到待寫入隊(duì)列并作為新的隊(duì)首數(shù)據(jù)。需要指出的是,本發(fā)明中此處并不是將臟數(shù)據(jù)本身插入到待寫入隊(duì)列,而僅將與臟數(shù)據(jù)相對(duì)應(yīng)的臟數(shù)據(jù)記錄讀出到內(nèi)存。此時(shí),待寫入隊(duì)列的隊(duì)首數(shù)據(jù)是相應(yīng)的臟數(shù)據(jù)記錄,而非臟數(shù)據(jù)本身。而且,臟數(shù)據(jù)記錄被插入到待寫入隊(duì)列的隊(duì)首,優(yōu)先被處理。由此,避免了臟數(shù)據(jù)只存在內(nèi)存中的不穩(wěn)定狀態(tài)。
寫入模塊450被配置為當(dāng)臟數(shù)據(jù)占用判斷模塊440判定目標(biāo)存儲(chǔ)位置未被臟數(shù)據(jù)占用時(shí),基于隊(duì)首數(shù)據(jù)在該目標(biāo)存儲(chǔ)位置進(jìn)行寫入。更新模塊460被配置為在數(shù)據(jù)文件中寫入了臟數(shù)據(jù)的情況下,更新由創(chuàng)建模塊410創(chuàng)建的臟數(shù)據(jù)記錄文件。這樣,通過臟數(shù)據(jù)遞歸優(yōu)先寫入以及臟數(shù)據(jù)記錄 文件磁盤空間預(yù)分配且持續(xù)持有的方案,使得數(shù)據(jù)文件中的臟數(shù)據(jù)與臟數(shù)據(jù)記錄文件中的臟數(shù)據(jù)記錄始終保持一致,保證下載的數(shù)據(jù)文件能夠有效打開,降低了下載失敗率。
在一個(gè)實(shí)施例中,寫入模塊450可以被配置為包括第一寫入單元451、第一判斷單元452和第二寫入單元453。第一判斷單元452被配置為判斷隊(duì)首數(shù)據(jù)是否為臟數(shù)據(jù)記錄。第一寫入單元451被配置為當(dāng)?shù)谝慌袛鄦卧?52判定隊(duì)首數(shù)據(jù)不是臟數(shù)據(jù)記錄時(shí),將該隊(duì)首數(shù)據(jù)寫入到數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置。第二寫入單元453被配置為當(dāng)?shù)谝慌袛鄦卧?52判定隊(duì)首數(shù)據(jù)是臟數(shù)據(jù)記錄時(shí),從數(shù)據(jù)文件中讀出與該臟數(shù)據(jù)記錄相對(duì)應(yīng)的臟數(shù)據(jù),并將該臟數(shù)據(jù)寫入到數(shù)據(jù)文件中的目標(biāo)存儲(chǔ)位置。
在另一個(gè)實(shí)施例中,更新模塊460被配置為包括第二判斷單元454和更新單元455。第二判斷單元454被配置為判斷是否基于隊(duì)首數(shù)據(jù)在目標(biāo)存儲(chǔ)位置成功地進(jìn)行了寫入。更新單元455被配置為當(dāng)?shù)诙袛鄦卧?54判定在目標(biāo)存儲(chǔ)位置成功地進(jìn)行了寫入,則在隊(duì)首數(shù)據(jù)是臟數(shù)據(jù)記錄的情況下以及/或者在隊(duì)首數(shù)據(jù)的目標(biāo)存儲(chǔ)位置是指定的臨時(shí)存儲(chǔ)位置的情況下,更新臟數(shù)據(jù)記錄文件。在數(shù)據(jù)文件中寫入了臟數(shù)據(jù)的情況下更新臟數(shù)據(jù)記錄文件,確保此時(shí)臟數(shù)據(jù)記錄文件中有該臟數(shù)據(jù)的對(duì)應(yīng)記錄,防止出現(xiàn)臟數(shù)據(jù)不一致的情況。就算下載過程中發(fā)生磁盤空間不足,也只需要及時(shí)將臟數(shù)據(jù)記錄寫回臟數(shù)據(jù)記錄文件就可以保持臟數(shù)據(jù)一致。在解決了磁盤空間不足的問題之后,將臟數(shù)據(jù)記錄中的記錄讀入到待寫入隊(duì)列中,即可繼續(xù)順利進(jìn)行數(shù)據(jù)下載。
在本發(fā)明的一個(gè)實(shí)施例中,上述數(shù)據(jù)存儲(chǔ)裝置400還可以包括檢查模塊470和暫停模塊480。檢查模塊470被配置為檢查對(duì)數(shù)據(jù)文件的讀寫處理是否成功,以檢測(cè)是否存在存儲(chǔ)空間不足的情況。暫停模塊480被配置為當(dāng)檢查模塊470判定在檢測(cè)到對(duì)數(shù)據(jù)文件的讀寫處理不成功的情況下,暫停對(duì)該數(shù)據(jù)文件的數(shù)據(jù)存儲(chǔ)。這樣,可以及時(shí)中斷后續(xù)的寫入嘗試。而且與現(xiàn)有技術(shù)相比,省去數(shù)據(jù)放到待寫入隊(duì)列前的空間預(yù)檢查,減少了下載過程中不必要的資源消耗。
本發(fā)明用于有效避免臟數(shù)據(jù)不一致的技術(shù)還可以實(shí)現(xiàn)為一種配置為包括處理器和存儲(chǔ)器的數(shù)據(jù)存儲(chǔ)系統(tǒng)。處理器可以被配置為執(zhí)行本發(fā)明上述的數(shù)據(jù)存儲(chǔ)處理。存儲(chǔ)器被配置為與處理器相連接,且存儲(chǔ)數(shù)據(jù)文件和臟 數(shù)據(jù)記錄文件。本發(fā)明還可以實(shí)現(xiàn)為包括上述數(shù)據(jù)存儲(chǔ)系統(tǒng)的便攜式電子設(shè)備,例如智能手機(jī)、平板電腦、上網(wǎng)機(jī)以及便攜式穿戴設(shè)備等。
綜上所述,本發(fā)明通過臟數(shù)據(jù)遞歸優(yōu)先寫入以及臟數(shù)據(jù)記錄文件磁盤空間預(yù)分配且持續(xù)持有的方案,解決了因磁盤空間不足而導(dǎo)致數(shù)據(jù)文件和臟數(shù)據(jù)記錄文件寫入失敗的問題,由此避免了出現(xiàn)臟數(shù)據(jù)不一致,從而降低了寫文件失敗率。進(jìn)一步,本發(fā)明用實(shí)際寫文件結(jié)果檢查取代磁盤空間預(yù)檢查,實(shí)現(xiàn)了更準(zhǔn)確高效的空間檢查,節(jié)省了下載過程的資源消耗。
此外,根據(jù)本發(fā)明的方法還可以實(shí)現(xiàn)為一種計(jì)算機(jī)程序,該計(jì)算機(jī)程序包括用于執(zhí)行本發(fā)明的上述方法中限定的上述各步驟的計(jì)算機(jī)程序代碼指令?;蛘撸鶕?jù)本發(fā)明的方法還可以實(shí)現(xiàn)為一種計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括計(jì)算機(jī)可讀介質(zhì),在該計(jì)算機(jī)可讀介質(zhì)上存儲(chǔ)有用于執(zhí)行本發(fā)明的上述方法中限定的上述功能的計(jì)算機(jī)程序。本領(lǐng)域技術(shù)人員還將明白的是,結(jié)合這里的公開所描述的各種示例性邏輯塊、模塊、電路和算法步驟可以被實(shí)現(xiàn)為電子硬件、計(jì)算機(jī)軟件或兩者的組合。
附圖中的流程圖和框圖顯示了根據(jù)本發(fā)明的多個(gè)實(shí)施例的系統(tǒng)和方法的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個(gè)方框可以代表一個(gè)模塊、程序段或代碼的一部分,所述模塊、程序段或代碼的一部分包含一個(gè)或多個(gè)用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所標(biāo)記的功能也可以以不同于附圖中所標(biāo)記的順序發(fā)生。例如,兩個(gè)連續(xù)的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時(shí)也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個(gè)方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的組合來實(shí)現(xiàn)。
以上已經(jīng)描述了本發(fā)明的各實(shí)施例,上述說明是示例性的,并非窮盡性的,并且也不限于所披露的各實(shí)施例。在不偏離所說明的各實(shí)施例的范圍和精神的情況下,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說許多修改和變更都是顯而易見的。本文中所用術(shù)語的選擇,旨在最好地解釋各實(shí)施例的原理、實(shí)際應(yīng)用或?qū)κ袌鲋械募夹g(shù)的改進(jìn),或者使本技術(shù)領(lǐng)域的其它普通技術(shù)人員能理解本文披露的各實(shí)施例。