MMKV 資料持久化 mmkv

2021-10-14 08:39:48 字數 1537 閱讀 2913

一、sharedpreference:

1、資料以xml格式儲存。

2、初始化時,會在子執行緒使用io讀取整個檔案的資料 ,進行xml解析,然後放在記憶體(所以不適合大資料儲存)中。

3、不要頻繁呼叫edit()-》 內部會建立例項物件,占用記憶體。

4、cmmit() 同步儲存,有返回結果。

5、更新、儲存資料,會把map中記錄的資料,重新組織為xml,覆蓋檔案儲存,全量更新。

涉及知識點:xml 解析、io、併發程式設計 (執行緒、鎖)、記憶體抖動(jvm)

傳統io:

虛擬記憶體被作業系統分為使用者空間(執行使用者程式**)、核心空間(執行核心**),核心空間所有程序共享,為了安全,是隔離的。即使使用者程式崩潰,核心不受影響。

例如:寫檔案流程:

①使用者程式write() 告訴核心寫入的資料開始位址和長度;

②核心將資料拷貝到核心頁快取;

③由作業系統呼叫,將資料拷貝到磁碟,完成寫入。

二、mmkv(mmap機制) -- 不適合大資料儲存

對檔案的讀寫操作,只需要從磁碟到使用者主存一次拷貝,減少一次資料的操作

使用邏輯記憶體對磁碟檔案進行對映,操作記憶體等同於操作檔案,不需要開執行緒,操作mmap的速度和操作記憶體一樣快。

c++實現方式介紹:(大致是有個讀、寫的方法,具體詳看官方開源.cpp檔案**)

int8_t : 佔8位 相當於 byte (乙個位元組)

mmkv 採用的是 protocolbuffer 編碼方式

資料格式: 有效資料長度--- key長度--- value值 --- key長度 --- value值 ...

資料更新方式:

a、增量寫入:不管key 是否重複,直接將資料追加再原來資料後。

b、全量寫入:當檔案大小不夠;

c、資料去重,去掉重複key後:檔案大小滿足寫入的資料大小,則可以直接更新全量寫入。

d、擴容:

1)重新設定檔案大小

.cpp 檔案中,重新設定資料大小(xx位元組) ftruncate(m_fd, newsize)

2)解除對映

munmap(m_ptr,oldsize)

3)重新對映

m_ptr = (int8_t*)mmap(m_ptr,newsize,prot_read|prot_write,map_shared,m_fd,0);

三、使用及原理介紹

mmap總結:

1、mmap 提高讀寫效率;

2、精簡資料,以最小的資料量表示最多的資訊,減少資料大小;

3、優先增量更新,避免每次全量寫入。

安卓效能優化之持久化配置資料 MMKV

有一定失敗率 會引起系統crash,雖然頻率是很低的 使用 import com.tencent.mmkv.mmkv mmkv kv mmkv.defaultmmkv kv.encode bool true boolean bvalue kv.decodebool bool kv.encode in...

mmap 以及MMKV 學習 一

基於mmap 的 mmkv原始碼分析 mmap 是記憶體對映的縮寫 memory map 什麼是記憶體對映?這是乙個來自linux 系統的概念。下面介紹什麼是mmap 以及如何使用mmap。程序的位址空間 程序位址空間 虛擬位址空間 是對位址的編碼,相當於指標,通過mmu memory manage...

ZUI易入門Android之 MMKV

今天我們主要從這幾個方面來解釋一下mmkv boolean intlong float double string set集合 byte陣列 可序列化物件 依賴注入 dependencies初始化 設定初始化的根目錄 string dir getfilesdir getabsolutepath mm...