一種不同存儲結構數據混合檢索方法【專利摘要】本發(fā)明是一種不同存儲結構數據混合檢索方法,系統(tǒng)對數據庫和內存中的數據結構混合檢索,包括在系統(tǒng)生成數據庫時和寫內存數據時,統(tǒng)一設置標識;系統(tǒng)對一個數據結構進行檢索時,先從數據庫或者內存中找到該數據結構,并獲得該數據結構的標識;開辟一片存儲空間,利用標識將數據庫和內存中所有具有該標識的數據結構拷貝到存儲空間中形成結果集;在結果集中進行檢索等步驟。這樣,結果集將會大減小,節(jié)省非常多的資源?!緦@f明】一種不同存儲結構數據混合檢索方法
技術領域:
[0001]本發(fā)明涉及不同存儲結構混合時的檢索方法,特別涉及一個系統(tǒng)中,應用程序需要檢索數據庫和內存中的數據時所采用的一種不同存儲結構數據檢索方法。【
背景技術:
】[0002]Sqlite3是輕型的數據庫,是遵守ACID的關系型數據庫管理系統(tǒng),它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域項目。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時能夠跟很多程序語言相結合,比如1^1、0#、?冊、如¥&等,還有(^(:接口,同樣比起1^891、?〇8丨8代301^這兩款開源的世界著名數據庫管理系統(tǒng)來講,它的處理速度比他們都快。[0003]這里ACID是指數據庫事務正確執(zhí)行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務(Transaction)的數據庫,必需要具有這四種特性,否則在事務過程(Transactionprocessing)當中無法保證數據的正確性,交易過程極可能達不到交易方的要求。[0004]SQLite引擎不是個程序與之通信的獨立進程,而是連接到程序中成為它的一個主要部分。所以主要的通信協議是在編程語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個數據庫(定義、表、索引和數據本身)都在宿主主機上存儲在一個單一的文件中。它的簡單的設計是通過在開始一個事務的時候鎖定整個數據文件而完成的。[0005]正是這種鎖的機制,導致SQLite在并發(fā)(包括多進程和多線程)讀寫方面的性能一直不太理想。數據庫可能會被寫操作獨占,從而導致其它讀寫操作阻塞或出錯。涉及到頻繁的操作或檢索下,尤其是結合內存數據結構的混合數據組成時的檢索查詢,效率將受到影響。[0006]共享內存是進程間通信中最簡單的方式之一。共享內存允許兩個或更多進程訪問同一塊內存,就如同mallocO函數向不同進程返回了指向同一個物理內存區(qū)域的指針。[0007]因為所有進程共享同一塊內存,共享內存在各種進程間通信方式中具有最高的效率。訪問共享內存區(qū)域和訪問進程獨有的內存區(qū)域一樣快,并不需要通過系統(tǒng)調用或者其它需要切入內核的過程來完成。同時它也避免了對數據的各種不必要的復制。[0008]因為系統(tǒng)內核沒有對訪問共享內存進行同步,您必須提供自己的同步措施。例如,在數據被寫入之前不允許進程從共享內存中讀取信息、不允許兩個進程同時向同一個共享內存地址寫入數據等。解決這些問題的常用方法是通過使用信號量進行同步。[0009]共享內存塊提供了在任意數量的進程之間進行高效雙向通信的機制。每個使用者都可以讀取寫入數據,但是所有程序之間必須達成并遵守一定的協議,以防止諸如在讀取信息之前覆寫內存空間等競爭狀態(tài)的出現。不幸的是,Linux無法嚴格保證提供對共享內存塊的獨占訪問,甚至是在您通過使用IPC_PRIVATE創(chuàng)建新的共享內存塊的時候也不能保證訪問的獨占性。同時,多個使用共享內存塊的進程之間必須協調使用同一個鍵值。[0010]在特定情況下,為了各個模塊的效率最大化以及協調。系統(tǒng)須將數據存儲在不同環(huán)境下,數據庫文件和linux系統(tǒng)內存中,各種數據將由2個或多個存儲位置存儲程序去組織調整這些數據。怎么去管理這些數據,保持數據實時性、正確性,能最快的速度檢索。[0011]目前,系統(tǒng)對數據庫和共享內存等不同結構數據進行混合檢索,如圖1所示,包括以下步驟:[0012]首先,要開辟一個公開內存空間,調用數據庫和內存至這個新開辟的空間中,形成一個包括數據庫內的表等數據結構和原來存儲在內存中的數據結構的一個巨大的結果集。[0013]其次,系統(tǒng)在主空巨大的結果集中對每一個數據結構進行檢索,獲得需要要的結果。[0014]上面的不同存儲結構數據混合檢索的方法具有如下不足:[0015]1、需要存儲巨大的結果集的海量存儲空間,也就是需要更大的內存。[0016]2、檢索巨大的結果集,需要占用更多的CPU時間。[0017]總之,目前在進行不同存儲結構數據混合檢索過程中,需要占用非常多的資源。【
發(fā)明內容】[0018]本發(fā)明針對目前在進行不同存儲結構數據混合檢索過程中,需要占用非常多的資源的不足,提供一種不同存儲結構數據混合檢索方法。[0019]本發(fā)明的技術方案是一種不同存儲結構數據混合檢索方法,系統(tǒng)對數據庫和內存中的數據結構混合檢索,包括以下步驟:[0020]步驟1、在系統(tǒng)生成數據庫時和寫內存數據時,統(tǒng)一設置標識;[0021]步驟2、系統(tǒng)進行檢索時,檢索所述的標示;[0022]步驟3、開辟一片存儲空間,將數據庫和內存中所有標識拷貝到存儲空間中形成結果集;[0023]步驟4、在結果集中進行檢索。[0024]這樣,結果集將會大減小,節(jié)省非常多的資源。[0025]以下將結合附圖和實施例,對本發(fā)明進行較為詳細的說明?!靖綀D說明】[0026]圖1為現的技術中混合檢索流程圖。[0027]圖2為本發(fā)明混合檢索流程圖。【具體實施方式】[0028]實施例1,本實施例是重點在于解決不同存儲結構數據混合檢索,能夠在最短的時間找到程序想要的結果集,保持各個存儲結構下數據的最新狀態(tài)。將數據按程序設定的格式組合,并返回給接口或者上層應用使用。[0029]本實施例中,一種不同存儲結構數據混合檢索方法,系統(tǒng)對數據庫和內存中的數據結構混合檢索,包括以下步驟:[0030]步驟1、在系統(tǒng)生成數據庫時和寫內存數據時,統(tǒng)一設置標識;[0031]內存就是指的一片存儲空間,數據都是以二進制存放在里面,以供CPU使用。數據庫文件,以文件的形式保存數據,讀取的時候也是如要讀到內存中在加以獲取的。[0032]數據庫中是以表的形式存儲的如表1所示:[0033]表1[0035]內存以另外一種表的形式保存如表2和表3所不:[0040]在上面的兩種存儲結構中,都設置了一個身份證,這個身份證就是上面所描述的標識。[0041]步驟2、系統(tǒng)進行檢索時,檢索所述的標示;[0042]在進行檢索時,只檢索標示,對如本實施例來說就是身份證。[0043]步驟3、開辟一片存儲空間,將數據庫和內存中所有標識的拷貝到存儲空間中形成結果集;[0044]在檢索時,將標識(該例子中指身份證號)放到結果集中去。如取出10萬個身份證放到結果集中以供查詢。[0045]步驟4、在結果集中進行檢索。[0046]此刻對上一步查詢出的標識結果集做操作。例如我只需要第200~500之間的數據。那么就從存儲標識的結果集中取出200~500之間這300個身份證。然后那這300個標識去在去查詢程序想要的數據。例如這300個身份證有一個是上面"小敏"的身份證號。那么我現在想查詢出小敏的各科考試成績,就用這個標識去檢索出來。行成最終我們需要的數據。[0047]本實施例中,對一個數據結構進行檢索時,先從數據庫或者內存中找到該數據結構,并獲得該數據結構的標識;就拿數據庫中的數據來說,在步驟1,已經設定好統(tǒng)一標識是。這個時候就查詢出一個小的結果集如:1000個MAC地址,這個小的結果集只儲存標識數據,其他的數據不包含,它就是之前所設的統(tǒng)一標識的一個結果集。然后在從這個已經查詢出的小的標識結果集中,取出我們想要的標識,如:取出第20到第40之間的20個MAC地址。然后用這個20個MAC再去查詢出完整的數據,這就是我們最終得到的結果數據集,同理內存也是這個原理。[0048]為了更好的說明,先定義一個表結構如:[0053]采用目前普遍使用的方法進行檢索:如圖1所示[0054]現有上面2個不同數據結構一個存放內存,一個存放數據庫文件中。此時此刻有一個需求是要從這兩個結構中查詢一張表。[0055]那么現在普遍的做法是:分別查詢1次,得到2個大的結果集,數據庫和內存中所有的數據,比如都10W條是10M大小;那么此時此刻程序就要分配10+10=20M-個空間,這是一個非常大的空間。就會消耗較多的程序性能,這跟數據量的大小成正比,因為數據量越大越消耗性能。因此,按照目前的方式進行檢索將會消耗非常多的資源。[0056]圖1中"請求數據庫必須做符合數據庫要求的處理",這是對查詢的數據做處理,比如說,數據中的是城市的編號,但要的是文字方式的那么就得拿這個編號如0755在做查詢找到"深圳市"。如此一來更加會加劇程序性能消耗和空間。[0057]"結果集",數據結構中是有很多張表數據的,而結果集只是查詢出數據結構中的部分內容。如學生表student_table的數據信息。[0058]"需要對數據庫和內存二者數據的整合"我們不可能叫所有的結果集都顯示,我們只需要一部分,也可以進行分片顯示。二個結果集的內容結果是不一樣的,這時候我就需要整合一下例如:取student_table中的姓名和Achievement_table的數理化成績。[0059]成績表[0061]數量是100條[0062]其實我們只要這些,但是前面我們查詢出了所有的字段和屬性,浪費資源浪費空間。[0063]在本實施例中,如圖2所示,在生成數據庫和寫內存時,系統(tǒng)為數據庫和內存統(tǒng)一設置標識。給2個數據結構加上相同的標識(如mac地址)這個地址是唯一的。[0064]同樣的分別對2個數據結構做查詢,此時的查詢只查詢出mac地址這一列的數據存放到結果集只需要那么此時程序就只需要分配的空間。[0065]2個結果集都是根據相同標識Mac在通過這個Mac再一次查詢,比如只要100條數據那么就拿100個Mac地址去查找,這時候查詢出來的結果集占的空間很小了。如100條對比1ow條差距就出來了,節(jié)省的很多空間和性能。[0066]采用本實施例的方法可以達到的效果:[0067]1:簡化。[0068]通過標識極大簡化了數據,不再臃腫。不再為多個屬性而做獨立處理。統(tǒng)一使用標識[0069]2:程序能夠更好的操作于處理。[0070]此時此刻為該抽象出的標識做處理,對比具有多個屬性不同環(huán)境下(數據庫文件和內存)要容易很多。這時候對結果及做切分,分片。效果提升明顯?!局鳈囗棥?.一種不同存儲結構數據混合檢索方法,系統(tǒng)對數據庫和內存中的數據結構混合檢索,其特征在于:包括以下步驟:步驟1、在系統(tǒng)生成數據庫時和寫內存數據時,統(tǒng)一設置標識;步驟2、系統(tǒng)進行檢索時,檢索所述的標示;步驟3、開辟一片存儲空間,將數據庫和內存中所有標識拷貝到存儲空間中形成結果集;步驟4、在結果集中進行檢索?!疚臋n編號】G06F17/30GK105868350SQ201610184945【公開日】2016年8月17日【申請日】2016年3月29日【發(fā)明人】楊興華,黃楚恩【申請人】深圳森格瑞通信有限公司