本技術(shù)涉及數(shù)據(jù)庫領(lǐng)域,尤其涉及一種數(shù)據(jù)寫入方法、裝置、計算機(jī)設(shè)備及存儲介質(zhì)。
背景技術(shù):
1、目前,在數(shù)據(jù)庫中,通常以數(shù)據(jù)表的形式來存儲文件。一個數(shù)據(jù)表包括多個數(shù)據(jù)頁,該多個數(shù)據(jù)頁持久化存儲在磁盤中,每個數(shù)據(jù)頁可以對應(yīng)一個內(nèi)存頁。當(dāng)計算機(jī)設(shè)備更新某個數(shù)據(jù)頁時,該計算機(jī)設(shè)備可以將該數(shù)據(jù)頁加載至對應(yīng)的內(nèi)存頁中進(jìn)行更新。
2、相關(guān)技術(shù)中,可以通過頁面二叉樹來管理一個數(shù)據(jù)表中空閑數(shù)據(jù)頁對應(yīng)的空閑內(nèi)存頁。當(dāng)計算機(jī)設(shè)備中的多個線程要在同一個數(shù)據(jù)表中寫入數(shù)據(jù)時,該多個線程可以分別根據(jù)待寫入的數(shù)據(jù)的數(shù)據(jù)量,通過該頁面二叉樹查找存在足夠空間的可用內(nèi)存頁。這樣,多個線程可能會查找到同一個可用內(nèi)存頁。在這種情況下,多個線程可以排隊依次為該可用內(nèi)存頁加寫鎖,并在加寫鎖成功后在該可用內(nèi)存頁中寫入數(shù)據(jù)?;诖耍绻摽捎脙?nèi)存頁為該數(shù)據(jù)表對應(yīng)的最后一個空閑內(nèi)存頁,且在某個線程寫完數(shù)據(jù)后,該可用內(nèi)存頁的剩余容量不夠后續(xù)的多個線程寫入數(shù)據(jù),則后續(xù)的多個線程將會同時申請擴(kuò)展數(shù)據(jù)表。在這種情況下,將由其中的一個線程根據(jù)申請擴(kuò)展數(shù)據(jù)表的線程的數(shù)量來為該多個線程一次性擴(kuò)展多個空閑數(shù)據(jù)頁,而其他線程則均進(jìn)行等待,這將導(dǎo)致數(shù)據(jù)表擴(kuò)展不夠及時。
技術(shù)實(shí)現(xiàn)思路
1、本技術(shù)提供一種數(shù)據(jù)寫入方法、裝置、計算機(jī)設(shè)備及存儲介質(zhì),用于改善多個線程在一個數(shù)據(jù)表并發(fā)寫入數(shù)據(jù)時的數(shù)據(jù)寫入性能。
2、為達(dá)到上述目的,本技術(shù)采用如下技術(shù)方案:
3、第一方面,提供一種數(shù)據(jù)寫入方法,該方法可以應(yīng)用于計算機(jī)設(shè)備中的第一線程,所述第一線程為所述計算機(jī)設(shè)備中運(yùn)行的待寫入數(shù)據(jù)的多個線程中的任一個,所述方法包括:如果在目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中未獲取到可用內(nèi)存頁,則在所述目標(biāo)數(shù)據(jù)表中為所述第一線程擴(kuò)展n個空閑數(shù)據(jù)頁,所述n為預(yù)設(shè)的大于0的整數(shù);基于所述n個空閑數(shù)據(jù)頁為所述目標(biāo)數(shù)據(jù)表擴(kuò)展空閑內(nèi)存頁;在擴(kuò)展的空閑內(nèi)存頁中寫入數(shù)據(jù)。
4、在本技術(shù)中,計算機(jī)設(shè)備中的任一個線程在目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中未獲取到可用內(nèi)存頁時,均可以為自身擴(kuò)展n個空閑數(shù)據(jù)頁,并基于該n個空閑數(shù)據(jù)頁擴(kuò)展空閑內(nèi)存頁,進(jìn)而在擴(kuò)展的空閑內(nèi)存頁中寫入數(shù)據(jù)。由此可見,任一個未能獲取到可用內(nèi)存頁的線程均可以自行觸發(fā)數(shù)據(jù)表擴(kuò)展流程來及時為自身擴(kuò)展n個數(shù)據(jù)頁供自身使用。并且,由于無需為其他線程擴(kuò)展數(shù)據(jù)頁,所以每個線程擴(kuò)展數(shù)據(jù)頁所需的時長較短,相較于由一個線程集中為所有未獲取到可用內(nèi)存頁的線程擴(kuò)展數(shù)據(jù)頁,而其他線程均進(jìn)行等待的方案,可以縮短線程阻塞時長,從而提高數(shù)據(jù)寫入性能。
5、可選地,所述在所述目標(biāo)數(shù)據(jù)表中為所述第一線程擴(kuò)展n個空閑數(shù)據(jù)頁的實(shí)現(xiàn)過程可以包括:為所述目標(biāo)數(shù)據(jù)表加寫鎖;如果為所述目標(biāo)數(shù)據(jù)表加寫鎖成功,則在持久化存儲設(shè)備中為所述目標(biāo)數(shù)據(jù)表申請n個擴(kuò)展存儲區(qū)域;在所述n個擴(kuò)展存儲區(qū)域內(nèi)寫入0,得到所述n個空閑數(shù)據(jù)頁;解除所述目標(biāo)數(shù)據(jù)表的寫鎖。
6、在本技術(shù)中,第一線程在擴(kuò)展空閑數(shù)據(jù)頁時首先對目標(biāo)數(shù)據(jù)表加鎖,以防止在擴(kuò)表的過程中其他線程對該目標(biāo)數(shù)據(jù)表進(jìn)行訪問而造成讀寫沖突。另外,第一線程擴(kuò)展數(shù)據(jù)表的過程包括在持久化存儲設(shè)備中擴(kuò)展空閑數(shù)據(jù)頁以及為空閑數(shù)據(jù)頁分配內(nèi)存頁并更新頁面二叉樹兩個子流程?;诖?,第一線程在持久化存儲設(shè)備中擴(kuò)展空閑數(shù)據(jù)頁時,對目標(biāo)數(shù)據(jù)表加寫鎖,但是不對目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹進(jìn)行加寫鎖,這樣,在第一線程擴(kuò)展空閑數(shù)據(jù)頁的過程中,其他完成數(shù)據(jù)頁擴(kuò)展的線程可以對頁面二叉樹進(jìn)行更新,這樣,不同線程可以分時執(zhí)行數(shù)據(jù)表擴(kuò)展流程中的不同子流程,如此,可以提高數(shù)據(jù)表的擴(kuò)展效率。
7、可選地,所述基于所述n個空閑數(shù)據(jù)頁為所述目標(biāo)數(shù)據(jù)表擴(kuò)展空閑內(nèi)存頁的實(shí)現(xiàn)過程可以包括:為所述n個空閑數(shù)據(jù)頁分配對應(yīng)的內(nèi)存頁;基于所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁,更新所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹,所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹包括多個頁面節(jié)點(diǎn),每個頁面節(jié)點(diǎn)用于指示所述目標(biāo)數(shù)據(jù)表對應(yīng)的一個空閑內(nèi)存頁。
8、可選地,所述基于所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁,更新所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹的實(shí)現(xiàn)過程可以包括:為所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹加寫鎖;如果為所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹加寫鎖成功,則在所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹中添加所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁所對應(yīng)的頁面節(jié)點(diǎn);解除所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹的寫鎖。
9、在本技術(shù)中,第一線程在對頁面二叉樹進(jìn)行更新之前先對頁面二叉樹加寫鎖,以防止多個線程同時對該目標(biāo)數(shù)據(jù)表的頁面二叉樹進(jìn)行更新而造成沖突。另外,第一線程擴(kuò)展數(shù)據(jù)表的過程包括在持久化存儲設(shè)備中擴(kuò)展數(shù)據(jù)頁以及為擴(kuò)展的數(shù)據(jù)頁分配內(nèi)存頁并更新頁面二叉樹兩個子流程?;诖耍谝痪€程在更新頁面二叉樹時,對頁面二叉樹加寫鎖,但不對目標(biāo)數(shù)據(jù)表加寫鎖,這樣,在第一線程更新頁面二叉樹的過程中,其他觸發(fā)數(shù)據(jù)表擴(kuò)展流程的線程則可以擴(kuò)展數(shù)據(jù)頁,這樣,不同線程可以分時執(zhí)行擴(kuò)表流程中的不同子流程,從而提高了數(shù)據(jù)表的擴(kuò)展效率。
10、可選地,所述方法還包括:在所述目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中查找可用內(nèi)存頁;如果為當(dāng)前查找到的可用內(nèi)存頁加寫鎖失敗,則統(tǒng)計加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量;如果加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量大于參考閾值,則確定在所述目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中未獲取到可用內(nèi)存頁。
11、在本技術(shù)中,第一線程無需等到確定出最后一個空閑內(nèi)存頁也用完才去擴(kuò)展數(shù)據(jù)表,而是在多次對查找到的可用內(nèi)存頁加寫鎖失敗且失敗次數(shù)超過閾值時,即可以直接觸發(fā)數(shù)據(jù)表擴(kuò)展流程。也即,第一線程在數(shù)據(jù)表還存在少量空閑內(nèi)存頁時即可以提前觸發(fā)數(shù)據(jù)表擴(kuò)展,這樣,可以改善在最后一個空閑內(nèi)存頁用完之后由一個線程來進(jìn)行擴(kuò)展,其他線程集中等待所導(dǎo)致的等待時長較長的問題。
12、第二方面,提供一種數(shù)據(jù)寫入方法,該方法可以應(yīng)用于計算機(jī)設(shè)備的第一線程中,該第一線程為計算機(jī)設(shè)備中運(yùn)行的待寫入數(shù)據(jù)的多個線程中的任一個。其中,第一線程可以在目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中查找可用內(nèi)存頁;如果為當(dāng)前查找到的可用內(nèi)存頁加寫鎖失敗,則在所述多個空閑內(nèi)存頁中查找其他的可用內(nèi)存頁;在加寫鎖成功的其他的可用內(nèi)存頁中寫入數(shù)據(jù)。
13、其中,第一線程為計算機(jī)設(shè)備運(yùn)行的數(shù)據(jù)庫應(yīng)用的一個事務(wù)線程,該事務(wù)線程用于在目標(biāo)數(shù)據(jù)表中寫入數(shù)據(jù)?;诖?,第一線程可以在目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中查找可用內(nèi)存頁。如果為當(dāng)前查找到的可用內(nèi)存頁加寫鎖失敗,則說明有其他線程正在訪問該可用內(nèi)存頁,在這種情況下,第一線程不等待其他線程釋放該可用內(nèi)存頁的鎖,而是直接在多個空閑內(nèi)存頁中查找其他的可用內(nèi)存頁,并在加鎖成功的其他的可用內(nèi)存頁中寫入數(shù)據(jù),如此可以縮短第一線程的等待時間,從而改善數(shù)據(jù)寫入性能。
14、可選地,第一線程在所述多個空閑內(nèi)存頁中查找其他的可用內(nèi)存頁時,可以從目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹中第一頁面節(jié)點(diǎn)的下一個頁面節(jié)點(diǎn)開始查找目標(biāo)頁面節(jié)點(diǎn),所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹包括多個頁面節(jié)點(diǎn),每個頁面節(jié)點(diǎn)用于指示所述目標(biāo)數(shù)據(jù)表對應(yīng)的一個空閑內(nèi)存頁,所述第一頁面節(jié)點(diǎn)用于指示當(dāng)前加鎖失敗的可用內(nèi)存頁,所述目標(biāo)頁面節(jié)點(diǎn)所指示的空閑內(nèi)存頁的剩余容量不小于待寫入數(shù)據(jù)的數(shù)據(jù)量;將所述目標(biāo)頁面節(jié)點(diǎn)所指示的空閑內(nèi)存頁作為其他的可用內(nèi)存頁。
15、也就是說,在本技術(shù)中,第一線程在為當(dāng)前查找到的可用內(nèi)存頁加寫鎖失敗之后,可以從當(dāng)前加寫鎖失敗的可用內(nèi)存頁所對應(yīng)的頁面節(jié)點(diǎn)的下一個節(jié)點(diǎn)開始繼續(xù)查找其他可用內(nèi)存頁,而不是從頁面二叉樹的根節(jié)點(diǎn)開始重新查找,如此,可以縮短查找時間。
16、可選地,如果為當(dāng)前查找到的可用內(nèi)存頁加寫鎖失敗,第一線程可以先統(tǒng)計加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量;如果加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量不大于參考閾值,再執(zhí)行從所述多個空閑內(nèi)存頁中查找其他的可用內(nèi)存頁的步驟。
17、如果加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量不大于參考閾值,則說明第一線程的加寫鎖失敗次數(shù)較少,在該目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中可能還存在其他的具有足夠空間來供第一線程寫入數(shù)據(jù)的可用內(nèi)存頁,在這種情況下,第一線程可以繼續(xù)在多個空閑內(nèi)存頁中查找其他的可用內(nèi)存頁。
18、可選地,如果為當(dāng)前查找到的可用內(nèi)存頁加寫鎖失敗,第一線程可以先統(tǒng)計加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量;如果加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量大于所述參考閾值,則在所述目標(biāo)數(shù)據(jù)表中為第一線程擴(kuò)展n個空閑數(shù)據(jù)頁,所述n為預(yù)設(shè)的大于0的整數(shù);基于所述n個空閑數(shù)據(jù)頁為目標(biāo)數(shù)據(jù)表擴(kuò)展空閑內(nèi)存頁,在擴(kuò)展的空閑內(nèi)存頁中寫入數(shù)據(jù)。
19、在本技術(shù)中,第一線程無需等到確定出最后一個空閑內(nèi)存頁也用完才去擴(kuò)展數(shù)據(jù)表,而是在多次對查找到的可用內(nèi)存頁加寫鎖失敗且失敗次數(shù)超過閾值時,即可以直接觸發(fā)數(shù)據(jù)表擴(kuò)充流程。也即,第一線程在數(shù)據(jù)表還存在少量空閑內(nèi)存頁時即可以提前觸發(fā)數(shù)據(jù)表擴(kuò)展,這樣,可以改善在最后一個空閑內(nèi)存頁用完之后由一個線程來進(jìn)行擴(kuò)展,其他線程集中等待所導(dǎo)致的等待時長較長的問題。并且,由于各個線程均可以在上述條件下直接觸發(fā)數(shù)據(jù)表擴(kuò)展流程,所以可以提高數(shù)據(jù)表擴(kuò)展效率,進(jìn)而提高數(shù)據(jù)寫入速度。
20、可選地,基于所述n個空閑數(shù)據(jù)頁為目標(biāo)數(shù)據(jù)表擴(kuò)展空閑內(nèi)存頁的實(shí)現(xiàn)過程可以包括:為該n個空閑數(shù)據(jù)頁分配對應(yīng)的內(nèi)存頁,基于所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁,更新目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹,以便各個線程可以通過更新后的頁面二叉樹來查找擴(kuò)展的空閑內(nèi)存頁寫入數(shù)據(jù)。其中,所述頁面二叉樹包括多個頁面節(jié)點(diǎn),每個頁面節(jié)點(diǎn)用于指示所述目標(biāo)數(shù)據(jù)表對應(yīng)的一個空閑內(nèi)存頁。
21、可選地,第一線程在所述目標(biāo)數(shù)據(jù)表中為自身擴(kuò)展n個空閑數(shù)據(jù)頁時,首先可以為所述目標(biāo)數(shù)據(jù)表加寫鎖,如果為所述目標(biāo)數(shù)據(jù)表加寫鎖成功,則在持久化存儲設(shè)備中為所述目標(biāo)數(shù)據(jù)表申請n個擴(kuò)展存儲區(qū)域;在所述n個擴(kuò)展存儲區(qū)域內(nèi)寫入0,得到所述n個空閑數(shù)據(jù)頁;之后,解除所述目標(biāo)數(shù)據(jù)表的寫鎖。
22、在本技術(shù)中,第一線程在擴(kuò)展數(shù)據(jù)頁時首先對目標(biāo)數(shù)據(jù)表加寫鎖,以防止在擴(kuò)表的過程中其他線程對該目標(biāo)數(shù)據(jù)表進(jìn)行訪問而造成讀寫沖突。另外,第一線程擴(kuò)展數(shù)據(jù)表的過程包括在持久化存儲設(shè)備中擴(kuò)展數(shù)據(jù)頁以及為擴(kuò)展的數(shù)據(jù)頁分配內(nèi)存頁并更新頁面二叉樹兩個子流程?;诖?,第一線程在持久化存儲設(shè)備中擴(kuò)展數(shù)據(jù)頁時,對目標(biāo)數(shù)據(jù)表加寫鎖,但是不對目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹進(jìn)行加寫鎖,這樣,在第一線程擴(kuò)展數(shù)據(jù)頁的過程中,其他完成數(shù)據(jù)頁擴(kuò)展的線程可以對頁面二叉樹進(jìn)行更新,這樣,不同線程可以分時執(zhí)行擴(kuò)表流程中的不同子流程,如此,可以提高數(shù)據(jù)表的擴(kuò)展效率。
23、可選地,第一線程基于所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁更新目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹的實(shí)現(xiàn)過程可以包括:為所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹加寫鎖;如果為所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹加寫鎖成功,則在所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹中添加所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁所對應(yīng)的頁面節(jié)點(diǎn);解除所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹的寫鎖。
24、在本技術(shù)中,第一線程在對頁面二叉樹進(jìn)行更新之前先對頁面二叉樹加寫鎖,以防止多個線程同時對該目標(biāo)數(shù)據(jù)表的頁面二叉樹進(jìn)行更新而造成沖突。另外,第一線程擴(kuò)展數(shù)據(jù)表的過程包括在持久化存儲設(shè)備中擴(kuò)展數(shù)據(jù)頁以及為擴(kuò)展的數(shù)據(jù)頁分配內(nèi)存頁并更新頁面二叉樹兩個子流程?;诖?,第一線程在更新頁面二叉樹時,對頁面二叉樹加寫鎖,但不對目標(biāo)數(shù)據(jù)表加寫鎖,這樣,在第一線程更新頁面二叉樹的過程中,其他觸發(fā)數(shù)據(jù)表擴(kuò)展流程的線程則可以擴(kuò)展數(shù)據(jù)頁,這樣,不同線程可以分時執(zhí)行擴(kuò)表流程中的不同子流程,從而提高了數(shù)據(jù)表的擴(kuò)展效率。
25、第三方面,提供一種數(shù)據(jù)寫入裝置,所述數(shù)據(jù)寫入裝置包括至少一個模塊,所述至少一個模塊用于通過計算機(jī)設(shè)備中的第一線程執(zhí)行上述第一方面所述的數(shù)據(jù)寫入方法。示例性的,所述至少一個模塊可以包括第一擴(kuò)展模塊、第二擴(kuò)展模塊和寫入模塊。
26、其中,第一擴(kuò)展模塊,用于如果在目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中未獲取到可用內(nèi)存頁,則通過第一線程在所述目標(biāo)數(shù)據(jù)表中為所述第一線程擴(kuò)展n個空閑數(shù)據(jù)頁,所述n為預(yù)設(shè)的大于0的整數(shù),所述第一線程為計算機(jī)設(shè)備中運(yùn)行的待寫入數(shù)據(jù)的多個線程中的任一個;第二擴(kuò)展模塊,用于通過所述第一線程基于所述n個空閑數(shù)據(jù)頁為所述目標(biāo)數(shù)據(jù)表擴(kuò)展空閑內(nèi)存頁;寫入模塊,用于通過所述第一線程在擴(kuò)展的空閑內(nèi)存頁中寫入數(shù)據(jù)。
27、可選地,所述第一擴(kuò)展模塊具體用于:為所述目標(biāo)數(shù)據(jù)表加寫鎖;如果為所述目標(biāo)數(shù)據(jù)表加寫鎖成功,則在持久化存儲設(shè)備中為所述目標(biāo)數(shù)據(jù)表申請n個擴(kuò)展存儲區(qū)域;在所述n個擴(kuò)展存儲區(qū)域內(nèi)寫入0,得到所述n個空閑數(shù)據(jù)頁;解除所述目標(biāo)數(shù)據(jù)表的寫鎖。
28、可選地,所述第二擴(kuò)展模塊具體用于:為所述n個空閑數(shù)據(jù)頁分配對應(yīng)的內(nèi)存頁;基于所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁,更新所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹,所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹包括多個頁面節(jié)點(diǎn),每個頁面節(jié)點(diǎn)用于指示所述目標(biāo)數(shù)據(jù)表對應(yīng)的一個空閑內(nèi)存頁。
29、可選地,所述第二擴(kuò)展模塊具體用于:為所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹加寫鎖;如果為所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹加寫鎖成功,則在所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹中添加所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁所對應(yīng)的頁面節(jié)點(diǎn);解除所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹的寫鎖。
30、可選地,所述裝置還包括:查找模塊,用于通過所述第一線程在所述目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中查找可用內(nèi)存頁;統(tǒng)計模塊,用于如果為當(dāng)前查找到的可用內(nèi)存頁加寫鎖失敗,則通過所述第一線程統(tǒng)計加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量;確定模塊,用于如果加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量大于參考閾值,則確定所述第一線程在所述目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中未獲取到可用內(nèi)存頁。
31、第四方面,提供一種數(shù)據(jù)寫入裝置,所述數(shù)據(jù)寫入裝置包括至少一個模塊,所述至少一個模塊用于通過計算機(jī)設(shè)備中的第一線程執(zhí)行上述第二方面所述的數(shù)據(jù)寫入方法。示例性的,所述至少一個模塊可以包括查找模塊和寫入模塊。
32、其中,查找模塊,用于通過第一線程在目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中查找可用內(nèi)存頁;如果為當(dāng)前查找到的可用內(nèi)存頁加寫鎖失敗,則在所述多個空閑內(nèi)存頁中查找其他的可用內(nèi)存頁,所述第一線程為計算機(jī)設(shè)備中運(yùn)行的待寫入數(shù)據(jù)的多個線程中的任一個;寫入模塊,用于通過所述第一線程在加寫鎖成功的其他的可用內(nèi)存頁中寫入數(shù)據(jù)。
33、可選地,所述查找模塊具體用于:從所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹中第一頁面節(jié)點(diǎn)的下一個頁面節(jié)點(diǎn)開始查找目標(biāo)頁面節(jié)點(diǎn),所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹包括多個頁面節(jié)點(diǎn),每個頁面節(jié)點(diǎn)用于指示所述目標(biāo)數(shù)據(jù)表對應(yīng)的一個空閑內(nèi)存頁,所述第一頁面節(jié)點(diǎn)用于指示當(dāng)前加鎖失敗的可用內(nèi)存頁,所述目標(biāo)頁面節(jié)點(diǎn)所指示的空閑內(nèi)存頁的剩余容量不小于待寫入數(shù)據(jù)的數(shù)據(jù)量;將所述目標(biāo)頁面節(jié)點(diǎn)所指示的空閑內(nèi)存頁作為其他的可用內(nèi)存頁。
34、可選地,所述查找模塊具體用于:如果為當(dāng)前查找到的可用內(nèi)存頁加寫鎖失敗,則統(tǒng)計加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量;如果加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量不大于參考閾值,則從所述多個空閑內(nèi)存頁中查找其他的可用內(nèi)存頁。
35、可選地,所述裝置還包括:第一擴(kuò)展模塊,用于如果加寫鎖失敗的可用內(nèi)存頁的累計數(shù)量大于所述參考閾值,則通過所述第一線程在所述目標(biāo)數(shù)據(jù)表中為所述第一線程擴(kuò)展n個空閑數(shù)據(jù)頁;第二擴(kuò)展模塊,用于通過所述第一線程為所述n個空閑數(shù)據(jù)頁分配對應(yīng)的內(nèi)存頁;基于所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁,更新所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹,所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹包括多個頁面節(jié)點(diǎn),每個頁面節(jié)點(diǎn)用于指示所述目標(biāo)數(shù)據(jù)表對應(yīng)的一個空閑內(nèi)存頁。
36、可選地,所述第一擴(kuò)展模塊具體用于:為所述目標(biāo)數(shù)據(jù)表加寫鎖;如果為所述目標(biāo)數(shù)據(jù)表加寫鎖成功,則在持久化存儲設(shè)備中為所述目標(biāo)數(shù)據(jù)表申請n個擴(kuò)展存儲區(qū)域;在所述n個擴(kuò)展存儲區(qū)域內(nèi)寫入0,得到所述n個空閑數(shù)據(jù)頁;解除所述目標(biāo)數(shù)據(jù)表的寫鎖。
37、可選地,所述第二擴(kuò)展模塊具體用于:為所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹加寫鎖;如果為所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹加寫鎖成功,則在所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹中添加所述n個空閑數(shù)據(jù)頁對應(yīng)的內(nèi)存頁所對應(yīng)的頁面節(jié)點(diǎn);解除所述目標(biāo)數(shù)據(jù)表對應(yīng)的頁面二叉樹的寫鎖。
38、第五方面,提供一種計算機(jī)設(shè)備,所述計算機(jī)設(shè)備包括處理器和存儲器,所述處理器用于執(zhí)行存儲器中存儲的至少一條程序指令或代碼,以實(shí)現(xiàn)上述第一方面或第二方面所述的數(shù)據(jù)寫入方法??蛇x地,所述存儲器為內(nèi)存,所述計算機(jī)設(shè)備還可以包括持久化存儲設(shè)備,所述持久化存儲設(shè)備可以為硬盤。
39、第六方面,提供一種計算機(jī)可讀存儲介質(zhì),所述計算機(jī)可讀存儲介質(zhì)中存儲有指令,當(dāng)所述指令在計算機(jī)設(shè)備上運(yùn)行時,使得所述計算機(jī)設(shè)備執(zhí)行上述第一方面或第二方面所述的數(shù)據(jù)寫入方法。
40、第七方面,提供了一種包含指令的計算機(jī)程序產(chǎn)品,當(dāng)該計算機(jī)程序產(chǎn)品在計算機(jī)設(shè)備上運(yùn)行時,使得計算機(jī)設(shè)備執(zhí)行上述第一方面或第二方面所述的數(shù)據(jù)寫入方法。
41、上述第三方面至第七方面所獲得的技術(shù)效果與第一方面或第二方面中對應(yīng)的技術(shù)手段獲得的技術(shù)效果近似,在這里不再贅述。
42、在本技術(shù)實(shí)施例中,計算機(jī)設(shè)備中的任一個線程在目標(biāo)數(shù)據(jù)表對應(yīng)的多個空閑內(nèi)存頁中未獲取到可用內(nèi)存頁時,均可以為自身擴(kuò)展n個空閑數(shù)據(jù)頁,并基于該n個空閑數(shù)據(jù)頁擴(kuò)展空閑內(nèi)存頁,進(jìn)而在擴(kuò)展的空閑內(nèi)存頁中寫入數(shù)據(jù)。由此可見,任一個未能獲取到可用內(nèi)存頁的線程均可以自行觸發(fā)數(shù)據(jù)表擴(kuò)展流程來及時為自身擴(kuò)展n個數(shù)據(jù)頁供自身使用。并且,由于無需為其他線程擴(kuò)展數(shù)據(jù)頁,所以每個線程擴(kuò)展數(shù)據(jù)頁所需的時長較短,相較于由一個線程集中為所有未獲取到可用內(nèi)存頁的線程擴(kuò)展數(shù)據(jù)頁,而其他線程均進(jìn)行等待的方案,可以縮短線程阻塞時長,從而提高數(shù)據(jù)寫入性能。