LMDB記憶體對映型資料庫

2021-10-24 05:16:43 字數 2397 閱讀 3219

lmdb是基於記憶體對映的,這意味著它返回指向鍵和值的記憶體位址的指標,而不需要像大多數其他資料庫那樣複製記憶體中的任何內容,因此它讀存速度非常快。

lmdb的檔案結構是乙個資料夾,裡面是乙個資料檔案和乙個鎖檔案,資料隨意複製,隨意傳輸。它的訪問簡單,不需要單獨的資料管理程序。只要在訪問**裡引用lmdb庫,訪問時給檔案路徑即可。

用lmdb資料庫來存放影象資料,而不是直接讀取原始影象資料的原因:

資料型別多種多樣,比如:二進位制檔案、文字檔案、編碼後的影象檔案jpeg、png等,不可能用一套**實現所有型別的輸入資料讀取,因此通過lmdb資料庫,轉換為統一資料格式可以簡化資料讀取層的實現。

lmdb具有極高的訪問速度,大大減少了系統訪問大量小檔案時的磁碟io的時間開銷。lmdb將整個資料集都放在乙個檔案裡,避免了檔案系統定址的開銷,你的儲存介質有多快,就能訪問多快,不會因為檔案多而導致時間長。lmdb使用了記憶體對映的方式訪問檔案,這使得檔案內定址的開銷大幅度降低。

1. 建立 lmdb 環境

2. 建立事務

3. 進行增刪改查,遍歷等操作

4. 提交事務

5. 關閉lmdb 環境

例如:import lmdb

# 建立 lmdb 環境

env = lmdb.open(lmdb_path, map_size=1099511627776)

#建立事務

txn = env.begin(write=true)

# 增刪改查

txn.put(str(1).encode(), "alice".encode())

txn.put(str(2).encode(), "bob".encode())

txn.delete(str(1).encode())

for key, value in txn.cursor():

print(key, value)

# 提交事務

txn.commit()

# 關閉lmdb 環境

cache = {} # 儲存鍵值對

with open(image_path, 'rb') as f:

# 讀取影象檔案的二進位制格式資料

image_bin = f.read()

# 用兩個鍵值對表示乙個資料樣本

cache['image_000'] = image_bin

cache['label_000'] = label

with env.begin(write=true) as txn:

for k, v in cache.items():

if isinstance(v, bytes):

# 型別為bytes

txn.put(k.encode(), v)

else:

# 標籤型別為str, 轉為bytes

txn.put(k.encode(), v.encode()) # 編碼

env.close()

這裡需要獲取影象檔案的二進位制格式資料,然後用兩個鍵值對儲存乙個資料樣本,即分開儲存和其標籤,然後分別將影象和標籤寫入到lmdb資料庫中,和上面例子一樣都需要將鍵值轉換為 bytes 格式

import cv2

import lmdb

import numpy as np

env = lmdb.open('lmdb_dir')

with env.begin(write=false) as txn:

# 獲取影象資料

image_bin = txn.get('image_000'.encode())

label = txn.get('label_000'.encode()).decode() # 解碼

# 將二進位制檔案轉為十進位制檔案(一維陣列)

image_buf = np.frombuffer(image_bin, dtype=np.uint8)

# 將資料轉換(解碼)成影象格式

# cv2.imread_grayscale為灰度圖,cv2.imread_color為彩色圖

img = cv2.imdecode(image_buf, cv2.imread_color)

cv2.imshow('image', img)

cv2.waitkey(0)

先通過 lmdb.open() 獲取之前建立的lmdb資料庫,這裡通過鍵得到和其標籤,因為寫入資料庫之前進行了編碼,所以這裡需要先解碼。

lmdb是記憶體對映型資料庫,基於k-v結構,讀存速度非常快,適用於神經網路大型資料集。

記憶體資料庫 關係型資料庫和非關係型資料庫

記憶體資料庫 關係型資料庫和非關係型資料庫 一 記憶體資料庫 關係型資料庫和非關係型資料庫 1.個人觀點 二 記憶體資料庫 redis,mongodb,sqlite,oracle等 三 raft分布式協議 四 redis出現宕機,如何保證資料不丟失?資料庫型別特性優點缺點 關係型資料庫 sqlite...

關係型資料庫 非關係型資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...

關係型資料庫 非關係型資料庫

2019 02 25 20 38 36 關係型資料庫和非關係型資料的比較 一 關係型資料庫 關係型資料庫最典型的資料結構是表,由二維表及其之間的聯絡所組成的乙個資料組織 優點 1 易於維護 都是使用表結構,格式一致 2 使用方便 sql語言通用,可用於複雜查詢 3 複雜操作 支援sql,可用於乙個表...