基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法
【專利摘要】基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法,屬于點(diǎn)云數(shù)據(jù)文件讀取【技術(shù)領(lǐng)域】。本發(fā)明為了解決現(xiàn)有的高大規(guī)模點(diǎn)云數(shù)據(jù)文件讀取時(shí)間延遲、讀取速度慢的問題。所述方法包括:內(nèi)存預(yù)分配過程和多點(diǎn)并寫過程,首先確定點(diǎn)云數(shù)據(jù)文件中點(diǎn)的數(shù)目,確定點(diǎn)云數(shù)據(jù)文件中所有點(diǎn)需要占用的內(nèi)存大小,預(yù)先為點(diǎn)云數(shù)據(jù)分配對(duì)應(yīng)大小的內(nèi)存;通過內(nèi)存映射文件機(jī)制,將點(diǎn)云數(shù)據(jù)文件映射到映射內(nèi)存后創(chuàng)建含有指定數(shù)量線程的線程池,每個(gè)線程負(fù)責(zé)解析映射內(nèi)存中的部分點(diǎn)數(shù)據(jù)信息,并將解析結(jié)果寫入到之前預(yù)先分配的內(nèi)存中實(shí)現(xiàn)多點(diǎn)并寫。測(cè)試結(jié)果表明,基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的讀取方法使點(diǎn)云數(shù)據(jù)文件特別是大規(guī)模點(diǎn)云數(shù)據(jù)文件的讀取速度提高220%~300%。
【專利說明】基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法,屬于點(diǎn)云數(shù)據(jù)文件讀取【技術(shù)領(lǐng)域】。
【背景技術(shù)】
[0002]隨著反求工程技術(shù)的發(fā)展,三維掃描設(shè)備在掃描規(guī)模和性能上都有很大提高,一方面可以非常容易地采集表達(dá)物體表面形狀的三維點(diǎn)云數(shù)據(jù),另一方面需要處理的點(diǎn)云數(shù)據(jù)規(guī)模則呈幾何級(jí)方式增長(zhǎng)。根據(jù)不同的應(yīng)用場(chǎng)合,點(diǎn)云數(shù)據(jù)的處理規(guī)模可從幾百個(gè)點(diǎn)到上千萬(wàn)個(gè)點(diǎn),甚至可以達(dá)到數(shù)億點(diǎn)的級(jí)別。
[0003]狹義的大規(guī)模點(diǎn)云數(shù)據(jù)的概念是宏觀上點(diǎn)的數(shù)量規(guī)模非常大,如數(shù)千萬(wàn),甚至數(shù)億;而廣義的大規(guī)模點(diǎn)云數(shù)據(jù)的概念則與處理點(diǎn)云數(shù)據(jù)的系統(tǒng)內(nèi)存有關(guān),相比于具有數(shù)TB甚至更大內(nèi)存的超級(jí)計(jì)算機(jī)系統(tǒng),處理數(shù)億的點(diǎn)云數(shù)據(jù)并不會(huì)顯得十分困難,而相比于僅有數(shù)十MB甚至更小內(nèi)存的計(jì)算機(jī)系統(tǒng),處理數(shù)萬(wàn)甚至更少的點(diǎn)云數(shù)據(jù)都很費(fèi)力。
[0004]應(yīng)用程序在真正地處理點(diǎn)云數(shù)據(jù)之前首先要將點(diǎn)云數(shù)據(jù)從外部硬盤文件加載到內(nèi)存中。當(dāng)讀取的點(diǎn)云數(shù)據(jù)文件規(guī)模比較小(幾百個(gè)點(diǎn)到數(shù)十萬(wàn)個(gè)點(diǎn))時(shí),用戶一般感覺不到明顯的時(shí)間延遲,不會(huì)影響用戶對(duì)應(yīng)用程序的體驗(yàn)。但是,當(dāng)點(diǎn)云數(shù)據(jù)文件的規(guī)模達(dá)到數(shù)百萬(wàn),特別是數(shù)千萬(wàn)甚至數(shù)億級(jí)別時(shí),讀取文件的時(shí)間延遲將會(huì)明顯甚至嚴(yán)重影響用戶體驗(yàn)。目前,通過調(diào)研相關(guān)文獻(xiàn)發(fā)現(xiàn),現(xiàn)有的點(diǎn)云數(shù)據(jù)文件讀取方法存在以下問題:
[0005]I)每一個(gè)所讀取的點(diǎn)數(shù)據(jù)的保存導(dǎo)致內(nèi)存的動(dòng)態(tài)分配。由于點(diǎn)云文件中所包含的點(diǎn)數(shù)量巨大,頻繁的內(nèi)存動(dòng)態(tài)分配將嚴(yán)重影響應(yīng)用程序的性能。C++標(biāo)準(zhǔn)庫(kù)中的vector類是此種應(yīng)用的典型代表。
[0006]2)讀取點(diǎn)云數(shù)據(jù)文件的操作順序化。由于傳統(tǒng)的文件操作均以文件句柄為基礎(chǔ),這限制了點(diǎn)云數(shù)據(jù)文件的讀取方式必須以順序化的形式完成,無(wú)法充分發(fā)揮CPU的多核并行能力。
[0007]以上兩個(gè)方面的問題嚴(yán)重影響了以點(diǎn)云數(shù)據(jù)特別是大規(guī)模點(diǎn)云數(shù)據(jù)處理為目的的軟件性能。
【發(fā)明內(nèi)容】
[0008]本發(fā)明的目的是提供一種基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法,以解決現(xiàn)有的高大規(guī)模點(diǎn)云數(shù)據(jù)文件讀取時(shí)間延遲、讀取速度(加載速度慢)的問題。
[0009]本發(fā)明為解決上述技術(shù)問題采取的技術(shù)方案是:
[0010]步驟A、內(nèi)存預(yù)分配過程:首先確定點(diǎn)云數(shù)據(jù)文件中點(diǎn)的數(shù)目,從而確定點(diǎn)云數(shù)據(jù)文件中所有點(diǎn)需要占用的內(nèi)存大小,然后預(yù)先為點(diǎn)云數(shù)據(jù)分配對(duì)應(yīng)大小的內(nèi)存;
[0011]步驟B、多點(diǎn)并寫過程:通過內(nèi)存映射文件機(jī)制,將點(diǎn)云數(shù)據(jù)文件映射到映射內(nèi)存后創(chuàng)建含有指定數(shù)量線程的線程池,每個(gè)線程負(fù)責(zé)解析映射內(nèi)存中的部分點(diǎn)數(shù)據(jù)信息,并將解析結(jié)果寫入到之前預(yù)先分配的內(nèi)存中,實(shí)現(xiàn)多點(diǎn)并寫。
[0012]步驟A是基于內(nèi)存預(yù)分配技術(shù)原理
[0013]內(nèi)存預(yù)分配技術(shù)要解決的問題就是在讀取大規(guī)模點(diǎn)云數(shù)據(jù)文件過程中,避免保存點(diǎn)數(shù)據(jù)所產(chǎn)生的頻繁的內(nèi)存分配操作。點(diǎn)的三個(gè)坐標(biāo)值具有相同的數(shù)據(jù)類型,因此每個(gè)點(diǎn)占用內(nèi)存的大小一定。在這種前提下,只要確定了點(diǎn)云數(shù)據(jù)文件中點(diǎn)的數(shù)目,即可以準(zhǔn)確的確定點(diǎn)云數(shù)據(jù)文件中所有點(diǎn)需要占用的內(nèi)存大小,因而可以提前為點(diǎn)云數(shù)據(jù)分配好內(nèi)存,避免了動(dòng)態(tài)內(nèi)存分配導(dǎo)致的性能問題,達(dá)到了內(nèi)存預(yù)分配技術(shù)的目的。經(jīng)過測(cè)試,本發(fā)明方法采用數(shù)據(jù)分塊方式確定點(diǎn)云數(shù)據(jù)文件中的點(diǎn)數(shù)目,與其它方法相比較的結(jié)果如圖1所
/Jn ο
[0014]步驟B是基于多點(diǎn)并寫技術(shù)原理
[0015]多點(diǎn)并寫技術(shù)的核心思想是借助于內(nèi)存映射文件機(jī)制,將對(duì)文件進(jìn)行的1操作由傳統(tǒng)的順序化方式改為由并行化方式完成?;具^程是將點(diǎn)云數(shù)據(jù)文件映射到內(nèi)存后創(chuàng)建含有指定數(shù)量線程的線程池,每個(gè)線程負(fù)責(zé)解析映射內(nèi)存中的部分點(diǎn)數(shù)據(jù)信息,并將解析結(jié)果寫入到之前預(yù)先分配的內(nèi)存中。如果不同地址處的內(nèi)存讀寫具有并行性,因此多個(gè)線程同時(shí)解析并寫入的操作并不會(huì)發(fā)生沖突,這將顯著提高點(diǎn)云數(shù)據(jù)文件的加載速度,如圖2所示。
[0016]本發(fā)明的有益效果是:
[0017]本發(fā)明提出并實(shí)現(xiàn)了 windows平臺(tái)下基于線程池和內(nèi)存映射文件的內(nèi)存預(yù)分配技術(shù)和多點(diǎn)并寫技術(shù),顯著提高了大規(guī)模點(diǎn)云數(shù)據(jù)文件的讀取速度。本發(fā)明方法采用數(shù)據(jù)分塊方式確定點(diǎn)云數(shù)據(jù)文件中的點(diǎn)數(shù)目與現(xiàn)有其它方法相比較,讀取時(shí)間遠(yuǎn)遠(yuǎn)小于現(xiàn)有方法,如圖1所示。對(duì)不同的點(diǎn)云數(shù)據(jù)文件讀取方法進(jìn)行了測(cè)試和比較,結(jié)果如圖4所示。測(cè)試結(jié)果表明,基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的讀取方法,可使點(diǎn)云數(shù)據(jù)文件特別是大規(guī)模點(diǎn)云數(shù)據(jù)文件的讀取速度提高220%?300%,而且隨著點(diǎn)云數(shù)據(jù)文件規(guī)模的增長(zhǎng),本發(fā)明所述讀取方法所用的讀取時(shí)間增長(zhǎng)較其它方法最低。從圖4看出,本發(fā)明方法相對(duì)現(xiàn)有的高大規(guī)模點(diǎn)云數(shù)據(jù)文件讀取速度有顯著的提高,相對(duì)于現(xiàn)有技術(shù)有了質(zhì)的變化,極大提聞了用戶體驗(yàn)。
[0018]本發(fā)明方法的使用將充分發(fā)揮多核CPU的并行計(jì)算優(yōu)勢(shì),使傳統(tǒng)的基于文件句柄的串行讀取模式改為基于內(nèi)存映射文件的并行讀取模式,并結(jié)合根據(jù)點(diǎn)云文件中點(diǎn)的數(shù)量預(yù)先分配對(duì)應(yīng)大小的內(nèi)存,以達(dá)到顯著提高大規(guī)模點(diǎn)云數(shù)據(jù)文件的加載速度。本發(fā)明方法也可應(yīng)用在其它類型的以文件讀取為瓶頸的領(lǐng)域。
【專利附圖】
【附圖說明】
[0019]圖1為本發(fā)明方法采用數(shù)據(jù)分塊方式確定點(diǎn)云數(shù)據(jù)文件中的點(diǎn)數(shù)目與其它方法相比較的結(jié)果圖,圖1中,橫坐標(biāo)為點(diǎn)云數(shù)據(jù)文件中點(diǎn)數(shù)目,縱坐標(biāo)為讀取時(shí)間,其單位為毫秒;圖2為本發(fā)明所述的多點(diǎn)并寫技術(shù)原理示意圖;圖3本發(fā)明方法流程框圖;圖4為本發(fā)明方法與其它方法性能比較曲線圖(讀取速度的比較圖),圖4中:橫坐標(biāo)為讀取的點(diǎn)云數(shù)據(jù)的大小,其單位為M,縱坐標(biāo)為讀取時(shí)間,其單位為毫秒。
【具體實(shí)施方式】
[0020]【具體實(shí)施方式】一:如圖2和3所不,本實(shí)施方式所述的一種基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法,其特征在于,所述方法為:
[0021]步驟A、內(nèi)存預(yù)分配過程:首先確定點(diǎn)云數(shù)據(jù)文件中點(diǎn)的數(shù)目,從而確定點(diǎn)云數(shù)據(jù)文件中所有點(diǎn)需要占用的內(nèi)存大小,然后預(yù)先為點(diǎn)云數(shù)據(jù)分配對(duì)應(yīng)大小的內(nèi)存;
[0022]步驟B、多點(diǎn)并寫過程:通過內(nèi)存映射文件機(jī)制,將點(diǎn)云數(shù)據(jù)文件映射到映射內(nèi)存后創(chuàng)建含有指定數(shù)量線程的線程池,每個(gè)線程負(fù)責(zé)解析映射內(nèi)存中的部分點(diǎn)數(shù)據(jù)信息,并將解析結(jié)果寫入到之前預(yù)先分配的內(nèi)存中,實(shí)現(xiàn)多點(diǎn)并寫。
[0023]步驟A是為了快速確定點(diǎn)云數(shù)據(jù)文件中的點(diǎn)的數(shù)目并預(yù)先分配對(duì)應(yīng)大小的內(nèi)存;通過內(nèi)存映射文件機(jī)制,結(jié)合線程池快速地將點(diǎn)云數(shù)據(jù)文件中的點(diǎn)數(shù)據(jù)讀取到步驟A中預(yù)先分配的內(nèi)存中,即多點(diǎn)并寫技術(shù)。
[0024]【具體實(shí)施方式】二:如2圖所示,本實(shí)施方式為【具體實(shí)施方式】一所述的基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法的具體實(shí)現(xiàn)過程為:
[0025]步驟一、選擇點(diǎn)云數(shù)據(jù)文件,
[0026]步驟二、確定點(diǎn)云數(shù)據(jù)文件中點(diǎn)的數(shù)目,采用數(shù)據(jù)分塊方式確定點(diǎn)云數(shù)據(jù)文件中的點(diǎn)數(shù)目,
[0027]步驟三、分配相應(yīng)大小的內(nèi)存:根據(jù)點(diǎn)云數(shù)據(jù)文件中點(diǎn)的數(shù)目確定點(diǎn)云數(shù)據(jù)文件中所有點(diǎn)需要占用的內(nèi)存大小,然后預(yù)先為點(diǎn)云數(shù)據(jù)分配對(duì)應(yīng)大小的內(nèi)存;
[0028]步驟四、將點(diǎn)云數(shù)據(jù)文件映射入映射內(nèi)存中,
[0029]步驟五、創(chuàng)建含有指定數(shù)量線程的線程池,
[0030]步驟六、對(duì)映射內(nèi)存文件分塊,并對(duì)每一塊文件數(shù)據(jù)的解析任務(wù)創(chuàng)建新線程,加入到線程池中,
[0031]步驟七、線程池中的活動(dòng)線程執(zhí)行解析任務(wù),并將解析結(jié)果保存到預(yù)分配內(nèi)存,
[0032]步驟八、判斷線程中是否有活動(dòng)線程,如果沒有,則結(jié)束映射文件數(shù)據(jù)解析,否則返回步驟七直至完成映射文件數(shù)據(jù)的解析。
[0033]【具體實(shí)施方式】三:本實(shí)施方式中,在步驟二中所述的數(shù)據(jù)分塊方式的具體操作過程為:分配指定大小的內(nèi)存緩沖區(qū)(如64KB),利用文件I/O函數(shù)讀取該大小的文件數(shù)據(jù),并從數(shù)據(jù)中查找換行符(“\n”)的數(shù)目,以確定該塊數(shù)據(jù)中的點(diǎn)的數(shù)目;如果該塊數(shù)據(jù)中的最后一個(gè)字符不是換行符,則表明該塊數(shù)據(jù)的最后一個(gè)點(diǎn)數(shù)據(jù)不完整,此時(shí)向前移動(dòng)文件指針,使指針位置指向這個(gè)點(diǎn)數(shù)據(jù)的起始位置;然后重新利用文件I/O函數(shù)讀取一塊新的文件數(shù)據(jù),重復(fù)此過程,直至文件中點(diǎn)的數(shù)據(jù)計(jì)算完畢。其它組成及連接關(guān)系與【具體實(shí)施方式】一或二相同。
[0034]【具體實(shí)施方式】四:本實(shí)施方式中,在步驟六中,對(duì)映射內(nèi)存文件分塊,并對(duì)每一塊文件數(shù)據(jù)的解析任務(wù)創(chuàng)建新線程,加入到線程池中的過程為:
[0035]首先確定缺省的分塊大小,如64KB,然后從映射文件內(nèi)存起始地址B處創(chuàng)建一個(gè)解析任務(wù),該解析任務(wù)經(jīng)過計(jì)算后能判定合適的結(jié)束地址C,保證從B到C處的數(shù)據(jù)為完整的若干個(gè)點(diǎn)信息,并將該解析任務(wù)作為線程添加到線程池中執(zhí)行,因此從B到C處的內(nèi)存空間大小可能會(huì)比64KB略??;接下來(lái)從映射文件內(nèi)存地址C+1處創(chuàng)建另一個(gè)解析任務(wù),并按照上述過程計(jì)算結(jié)束地址D,并將該解析任務(wù)作為線程添加到線程池中執(zhí)行;重復(fù)循環(huán)該過程,直至為每一個(gè)映射文件內(nèi)存塊都創(chuàng)建了解析任務(wù),并添加到線程池中執(zhí)行。其它組成及連接關(guān)系與【具體實(shí)施方式】一、二或三相同。
[0036]以上所述,僅為本發(fā)明較佳的【具體實(shí)施方式】,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本【技術(shù)領(lǐng)域】的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),根據(jù)本發(fā)明的技術(shù)方案及其發(fā)明構(gòu)思加以等同替換或改變,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法,其特征在于,所述方法為: 步驟A、內(nèi)存預(yù)分配過程:首先確定點(diǎn)云數(shù)據(jù)文件中點(diǎn)的數(shù)目,從而確定點(diǎn)云數(shù)據(jù)文件中所有點(diǎn)需要占用的內(nèi)存大小,然后預(yù)先為點(diǎn)云數(shù)據(jù)分配對(duì)應(yīng)大小的內(nèi)存; 步驟B、多點(diǎn)并寫過程:通過內(nèi)存映射文件機(jī)制,將點(diǎn)云數(shù)據(jù)文件映射到映射內(nèi)存后創(chuàng)建含有指定數(shù)量線程的線程池,每個(gè)線程負(fù)責(zé)解析映射內(nèi)存中的部分點(diǎn)數(shù)據(jù)信息,并將解析結(jié)果寫入到之前預(yù)先分配的內(nèi)存中,實(shí)現(xiàn)多點(diǎn)并寫。
2.根據(jù)權(quán)利要求1所述的一種基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法,其特征在于,所述方法的具體實(shí)現(xiàn)過程為: 步驟一、選擇點(diǎn)云數(shù)據(jù)文件, 步驟二、確定點(diǎn)云數(shù)據(jù)文件中點(diǎn)的數(shù)目,采用數(shù)據(jù)分塊方式確定點(diǎn)云數(shù)據(jù)文件中的點(diǎn)數(shù)目, 步驟三、分配相應(yīng)大小的內(nèi)存:根據(jù)點(diǎn)云數(shù)據(jù)文件中點(diǎn)的數(shù)目確定點(diǎn)云數(shù)據(jù)文件中所有點(diǎn)需要占用的內(nèi)存大小,然后預(yù)先為點(diǎn)云數(shù)據(jù)分配對(duì)應(yīng)大小的內(nèi)存; 步驟四、將點(diǎn)云數(shù)據(jù)文件映射入映射內(nèi)存中, 步驟五、創(chuàng)建含有指定數(shù)量線程的線程池, 步驟六、對(duì)映射內(nèi)存文件分塊,并對(duì)每一塊文件數(shù)據(jù)的解析任務(wù)創(chuàng)建新線程,加入到線程池中, 步驟七、線程池中的活動(dòng)線程執(zhí)行解析任務(wù),并將解析結(jié)果保存到預(yù)分配內(nèi)存, 步驟八、判斷線程中是否有活動(dòng)線程,如果沒有,則結(jié)束映射文件數(shù)據(jù)解析,否則返回步驟七直至完成映射文件數(shù)據(jù)的解析。
3.根據(jù)權(quán)利要求2所述的一種基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法,其特征在于,步驟二中所述的數(shù)據(jù)分塊方式的具體操作過程為:分配指定大小的內(nèi)存緩沖區(qū),利用文件I/O函數(shù)讀取該大小的文件數(shù)據(jù),并從數(shù)據(jù)中查找換行符的數(shù)目,以確定該塊數(shù)據(jù)中的點(diǎn)的數(shù)目;如果該塊數(shù)據(jù)中的最后一個(gè)字符不是換行符,則表明該塊數(shù)據(jù)的最后一個(gè)點(diǎn)數(shù)據(jù)不完整,此時(shí)向前移動(dòng)文件指針,使指針位置指向這個(gè)點(diǎn)數(shù)據(jù)的起始位置;然后重新利用文件I/o函數(shù)讀取一塊新的文件數(shù)據(jù),重復(fù)此過程,直至文件中點(diǎn)的數(shù)據(jù)計(jì)算完畢。
4.根據(jù)權(quán)利要求2或3所述的一種基于內(nèi)存預(yù)分配和多點(diǎn)并寫技術(shù)的大規(guī)模點(diǎn)云數(shù)據(jù)快速讀取方法,其特征在于, 在步驟六中,對(duì)映射內(nèi)存文件分塊,并對(duì)每一塊文件數(shù)據(jù)的解析任務(wù)創(chuàng)建新線程,加入到線程池中的過程為: 首先確定缺省的分塊大小,然后從映射文件內(nèi)存起始地址B處創(chuàng)建一個(gè)解析任務(wù),該解析任務(wù)經(jīng)過計(jì)算后能判定合適的結(jié)束地址C,保證從B到C處的數(shù)據(jù)為完整的若干個(gè)點(diǎn)信息,并將該解析任務(wù)作為線程添加到線程池中執(zhí)行;接下來(lái)從映射文件內(nèi)存地址C+1處創(chuàng)建另一個(gè)解析任務(wù),并按照上述過程計(jì)算結(jié)束地址D,并將該解析任務(wù)作為線程添加到線程池中執(zhí)行;重復(fù)循環(huán)該過程,直至為每一個(gè)映射文件內(nèi)存塊都創(chuàng)建了解析任務(wù),并添加到線程池中執(zhí)行。
【文檔編號(hào)】G06F12/02GK104268096SQ201410503690
【公開日】2015年1月7日 申請(qǐng)日期:2014年9月26日 優(yōu)先權(quán)日:2014年9月26日
【發(fā)明者】張建生 申請(qǐng)人:西南科技大學(xué)