<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
dbm(database manager) 是使用本地檔案來儲存資料的資料庫,基於Key -Value對資料進行儲存、讀取,且有些dbm的實現( berkeley db)還支援BTree索引。dbm效率相對較高,甚至在某些情況下比關係型資料庫系統的速度還更高,因為幾乎所有dbm都支援比BTree效率要高的hash索引方式。
有多種dbm實現:標準dbm、ndbm( new dbm)、gdbm(GNU DBM)、sdbm( small dbm)、Berkeley db等, gdbm是對ndbm的擴充套件,它支援快取功能。
Ruby中要使用gdbm,它依賴於gdbm擴充套件庫和標頭檔案,所以需先安裝:
# sudo yum install gdbm-devel # Windows: # ridk exec uname -a確定32位元還是64位元, # 然後ridk exec pacman -S mingw-w64-<$arch>-gdbm sudo apt install libgdbm-dev gem install gdbm
使用類方法GDBM.new()
或者GDBM.open()
可開啟gdbm來操作db檔案。
require 'gdbm' gdbm = GDBM.new("/tmp/lang.db") gdbm["perl"] = "Perl" gdbm["shell"] = "Shell" gdbm["php"] = "PHP" gdbm.close
檢視其檔案內容:
$ ls -l /tmp/lang.db -rw-rw-rw- 1 longshuai longshuai 8192 May 17 21:22 /tmp/lang.db $ cat /tmp/lang.db P |...x...l9php...rdshe...}N;iperl...perlPerlshellShellphpPHP
其中…表示的是亂碼部分。
注意其大小為8K,且資料區預設在db檔案的尾部,包含了key和value。
從db中檢索資料:
gdbm = GDBM.open("/tmp/lang.db") pp gdbm["perl"] pp gdbm["php"] gdbm.close
new()或open():open()可給定語句塊,語句塊退出時自動關閉IO流,未給定語句塊時,open()等價於new()。
new(filename, mode = 0666, flags = nil) open(filename, mode = 0666, flags = nil) open(filename, mode = 0666, flags = nil) { |gdbm| ... }
當指定要操作的db檔案不存在時,會建立檔案,可指定建立檔案時的許可權。此外,flag引數接受如下值:
### 注意:writer方式可讀可寫 READER - 以唯讀方式開啟,即返回一個reader WRITER - 以可讀寫方式開啟,即返回一個writer WRCREAT - writer,如果資料庫檔案不存在,則建立 NEWDB - writer,總是截斷覆蓋已存在的資料庫檔案 # 上面的三個writer可使用位或(|)的方式結合下面的選項: SYNC - 以sync模式寫入資料庫檔案 NOLOCK - 開啟時不鎖定資料庫檔案
在未給定任何選項時,即預設情況下,總是先嚐試以WRCREAT的方式開啟,即以writer開啟且檔案不存在時建立。但如果開啟失敗(比如另一個程序已經開啟且還未關閉),則嘗試使用reader方式開啟。
reader和reader之間互相相容,writer和writer之間以及writer和reader之間互斥。所以,在某一時刻,允許同時有多個reader,但只能有一個writer。
當開啟gdbm範例後,它可以按照操作hash結構的方式去操作db,此外,gdbm已經mix-in Enumerable模組,所以可以直接使用該模組中的一些方法,比如find、grep、map等。
######### 查詢、插入、更新 ######### ["key"] fetch(key [, default]) → value 檢索指定的key。 使用`[]`檢索時,如果key不存在將返回nil, 使用fetch檢索時,如果key不存在則報錯,或者返回指定的預設值 values_at(key, ...) → array 檢索一個或多個key,並以陣列方式返回對應的value ["key"]= value store(key, value) → value 更新指定的key,如果key不存在則插入 ########## 遍歷 ######### each_pair { |key, value| block } → gdbm each_key { |key| block } → gdbm each_value { |value| block } → gdbm 分別根據key-value、key、value遍歷db ######### 其它檢索、篩選方式 ######### key(value) → key 根據value找到其key,如果有多個相同的value,返回第一個 keys → array 以陣列方式返回db中所有的key values → array 以陣列方式返回所有value select { |key, value| block } → array 篩選所有滿足條件的key-value ######### 判斷key或value是否存在 ######### has_key?(k) → true or false include?(k) → true or false key?(k) → true or false member?(k) → true or false 判斷key是否存在 has_value?(v) → true or false value?(v) → true or false 判斷指定的value是否存在 ######### 刪除 ######### delete(key) → value or nil 根據key移除key-value並返回被移除的Key-value,db若空,返回nil shift → (key, value) or nil 移除指定的key-value,並以陣列方式返回之,db若空,則返回nil delete_if { |key, value| block } → gdbm 移除滿足條件(語句塊返回true)的key-value,直接修改gdbm reject { |key, value| block } → hash 等價於delete_if,但不修改gdbm,而是以hash的方式返回 reject! { |key, value| block } → gdbm 等價於delete_if,直接修改gdbm clear → gdbm 清空db中所有key-value ######## 大小判斷 ######### empty? → true or false db是否為空 length → fixnum size → fixnum 等價,返回db中的key-value數量 ####### 其它操作 ######### invert → hash 反轉gdbm中key-value:key作為value,value作為key,並以hash的方式返回 close → nil 關閉已開啟的db檔案 closed? → true or false 判斷db檔案是否已關閉 replace(other) → gdbm 將另一個gdbm(即other)的內容覆蓋替換到當前的gdbm update(other) → gdbm 用另一個gdbm(即Other)合併到當前gdbm,若key衝突,則當前gdbm的key被覆蓋 reorganize → gdbm 重組gdbm cachesize = size → size 設定gdbm內部的hash桶快取大小 ######## gdbm模式 ######### sync → gdbm 將IO buffer中的資料刷入磁碟中的db檔案,全部寫入成功才返回 如果以SYNC標記開啟,則無需sync() fastmode = boolean → boolean syncmode = boolean → boolean 開啟或關閉sync模式。 sync模式下,寫入操作需要寫入磁碟db檔案成功(或失敗)後才返回, 非sync模式下,只需寫入io buffer即可返回。 syncmode方法在gdbm >= 1.8才可用,在此版本之前,使用方法fastmode= ######### 轉換 ######### to_a → array to_hash → hash 轉換為陣列、轉換為hash
更多關於Ruby使用GDBM操作DBM資料儲存的方法請檢視下面的相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45