所有版本的linux以及大多數的unix版本都隨系統帶有乙個基本的、但卻非常搞笑的資料儲存歷程集,他被稱為dbm資料庫。適用於儲存比較靜態的索引化資料庫,即使用索引來儲存可變長的資料結構,然後通過索引或順序掃瞄資料庫來檢索結構,適用於處理那些被頻繁訪問但卻很少被更新的資料,因為建立資料項時非常慢,而檢索時非常快。
dbm資料庫存在著各種不同的版本,他們的api介面和特性都有一些細微的差別。最初的dbm集,又有「新」的被稱為ndbm的dbm集,還有gnu的dbm實現gdbm。gnu的實現版本雖然可以模擬舊版本的dbm和ndbm介面,但本身的介面和其他實現版本相比,還是有著顯著的不同。大多數主流的linux發行版都會預設安裝gdbm,但一些發行版,就需要安裝,如ubuntu——需要安裝libgdbm-dev。
雖說你已經安裝了gdbm和ndbm了,系統在預設情況下支援ndbm模式,你還要知道如何編譯這些原始檔。例如安裝了gdbm,需如下操作:
(1) 在c原始檔中包含標頭檔案ndbm.h;
(2) 使用編譯行選項-i/usr/include/gdbm包含頭檔案目錄/usr/include/gdbm;
(3) 使用編譯行選項-lgdbm連線gdbm庫
(1) 在c原始檔中包含標頭檔案gdbm.h,而不是ndbm.h;
(2) 使用編譯行選項-i/usr/include/gdbm包含頭檔案目錄/usr/include/gdbm;
(3) 使用編譯行選項-lgdbm_compat連線其他的gdbm庫
注意:在gdbm相容模式下c原始檔的標頭檔案要包含如果不是,則用gdbm-ndbm.**件替換ndbm.h。
1.準備工作
在開始解釋每個dbm函式之前,你必須明白dbm資料庫能夠做什麼,這會更好的幫助你理解該如何使用dbm函式。
dbm資料庫的基本袁術是需要儲存的資料以及與他關聯的在檢索資料時用作關鍵字的資料塊。每個dbm資料庫必須針對對每個要儲存的資料有乙個唯一的關鍵字。關鍵字的取值被用作儲存資料的索引。dbm對於關鍵字和資料沒有限制,對使用超長關鍵字和資料的情況也為定義任何錯誤。規範允許具體實現把關鍵字/資料對的長度限制為1023個位元組,但具體實現通常不會進行限制,這是因為具體實現往往要比技術規範所要求的更靈活。
為了操作這些資料塊,標頭檔案ndbm.h定義了乙個名為datum的新資料型別。該型別確切的內容依賴於集體實現,但它至少包含下面兩個成員:
void *dptr;size_t dsize;
datum是乙個用typedef語句定義的型別。在ndbm.**件中還為dbm宣告了乙個型別定義,它是乙個用來訪問資料的結構,其作用和用來訪問檔案file結構很相似。還是那句話,dbm型別定義的內部結構依賴與具體實現。
在使用dbm庫是,如果要引用乙個資料塊,必須宣告datum型別的變數,將成元dptr指向資料的起始點,並把成員dsize設為包含資料的長度。無論是待儲存的資料或用來訪問他的索引都總是通過這個datum型別來引用。當開啟乙個dbm資料庫時,通常會建立兩個物理檔案,字尾分別是.pag和.dir並返回乙個dbm指標,它被用來訪問這兩個檔案,且這兩個檔案不應該被直接讀寫,只能通過dbm例程來進行。在一些視線中,這兩個檔案被合併到一起,開啟資料庫只會建立乙個檔案。
2 dbm訪問函式
dbm *dbm_open(const char *filename,int file_open_flags,mode_t file_mode); //filename基本檔名(不包含.dir .pag,返回乙個指向dbm型別的指標。如果失敗,返回(dbm *)0int dbm_store(dbm *database_descriptor,datum key,datum content,int store_mode);datum dbm_fetch(dbm *database_descriptor,datum key);void dbm_close(dbm *database_descriptor);
1.dbm_open函式——用來開啟以後或建立資料庫,第二個引數控制資料庫的讀、寫或讀/寫許可權。如果要建立乙個新的資料庫,這個標誌必須與o_creat進行二進位制或才允許被建立。第三個引數指定將被建立的檔案的許可權。
2.dbm_store函式——將資料儲存資料庫中。為了定義你想要儲存的資料和用來引用它的索引,必須設定兩個datum型別的引數;乙個用於引用索引,乙個用於實際資料。store_mode用於控制當試圖以乙個已有的關鍵字儲存資料時會發生的情況:設定為dbm_insert,儲存操作將失敗並且dbm_store返回1;設定為dbm_replace,則新資料將覆蓋已有資料並且dbm_store返回0;當發生其他錯誤,dbm_store將返回乙個負值。
3.dbm_fetch函式——用於從資料庫中檢索資料。它使用乙個先前dbm_open函式返回的指標和乙個指向關鍵字的datum型別結構作為其引數。它返回乙個datum結構型別(雖說返回的僅僅包含乙個指向資料的指標。實際資料依然儲存在dbm庫的本地儲存空間中,在繼續呼叫dbm函式前,必須把資料複製到程式的變數中才行)。如果資料庫中找到與這個關鍵字關聯的資料,返回的datum結構的dptr和dsize成員的值將被設為相應資料的值。如果沒有找到關鍵字,dptr將被設定為null。
4.dbm_close函式——關閉dbm_open開啟的資料庫。
3 其他dbm函式
int dbm_delete(dbm *database_descriptor,datum key);//從資料庫中刪除資料,成功時返回0.int dbm_error(dbm *database_descriptor);//只是用於測試資料庫中是否有錯誤發生,如果沒有就返回0.int dbm_clearerr(dbm *database_descriptor);//用於清楚資料庫中所有已被置位的錯誤條件標誌datum dbm_firstkey(dbm *database_descriptor);datum dbm_nextkey(dbm *database_descriptor);//這兩個函式一般稱對使用來對資料庫中的所有關鍵字進行掃瞄。
dbm與mysql 關於dBm與功率轉換
1 口算規律乙個基準 和兩個原則 1個基準 30dbm 1w 2個原則 3db,對應功率 x2,3db,對應功率 2 10db,對應功率 x10,10db,對應功率 10 2 幾乎所有整數的dbm都可用以上的 1個基準 和 2個原則 轉換為w。例1 100mw 3db w 100mw 3db 100...
DBM 和 DBN 的區別
下邊這部分摘自知乎 首先,還是糾正下題主,直接疊加rbm是dbn。而dbm是乙個真正的無向圖模型,層間互有反饋。dbn是hiton在06年發表在science上的 reducing the dimensionality of data with neural networks.這篇文章中提到的方法,...
關於dBm與功率轉換
1 口算規律乙個基準 和兩個原則 1個基準 30dbm 1w 2個原則 3db,對應功率 x2,3db,對應功率 2 10db,對應功率 x10,10db,對應功率 10 2 幾乎所有整數的dbm都可用以上的 1個基準 和 2個原則 轉換為w。例1 100mw 3db w 100mw 3db 100...