R語言本地緩存memoise

前言

緩存技術在計算機系統中運用地非常廣泛,特別是對於重複性計算,緩存能為我們節省大量的CPU時間,可能是99%。R語言以統計計算著名,但其中很多演算法包都是在進行大量重複的計算。

優化正再進行,改變已經開始。以Hadley Wickham為代表的R語言領軍人物,正在讓R快起來!你感覺到了嗎?!

目錄

  1. memoise介紹
  2. memoise安裝
  3. memoise的API介紹
  4. memoise使用
  5. memoise源代碼分析

1. memoise介紹

memoise是一個簡單的緩存包,主要用來減少重複計算,從而提升CPU性能。當你用相同的參數執行計算的時候,你會得到之前計算過的結果,而不是重算一遍。

緩存技術對於有並發訪問的應用來說,是性價比最高的性能提升方案。

註:memoise包是「Hadley Wickham」大神的作品!

memoise的發布頁:CRAN - Package memoise

2. memoise安裝

系統環境

  • Win7 64bit
  • R: 3.0.1 x86_64-w64-mingw32/x64 b4bit

memoise安裝

~Rnn> install.packages("memoise")ntrying URL http://mirror.bjtu.edu.cn/cran/bin/windows/contrib/3.0/memoise_0.1.zipnContent type application/zip length 10816 bytes (10 Kb)nopened URLndownloaded 10 Kbnnpackage 『memoise』 successfully unpacked and MD5 sums checkedn

memoise載入

> library(memoise)n

3. memoise的API介紹

非常簡單的API列表,只有2個函數。

  • forget: 重置緩存函數
  • memoize: 定義緩存函數

4. memoise使用

緩存測試

#定義緩存函數n> fun <- memoise(function(x) { Sys.sleep(1); runif(1) })nn#第一次執行fun函數n> system.time(print(fun()))n[1] 0.05983416n用戶 系統 流逝 n0 0 1nn#第二次執行fun函數 n> system.time(print(fun()))n[1] 0.05983416n用戶 系統 流逝 n0 0 0 nn#重置緩存函數n> forget(fun)n[1] TRUEnn#第三次執行fun函數 n> system.time(print(fun()))n[1] 0.6001663n用戶 系統 流逝 n0 0 1 n

  • 1. 定義緩存函數memoise
  • 2. 第一次執行fun函數, 等待sleep(1)
  • 3. 第二次執行fun函數, 無等待,直接從緩存中返回結果
  • 4. 重置緩存函數forget
  • 5. 第三次執行fun函數, 由於fun被重置,返回2,等待sleep(1)

5. memoise源代碼分析

1). memoise函數

  • 1. new_cache創建新的緩存空間,給f函數
  • 2. 生成f函數的hash值,作為key
  • 3. 返回緩存後的,f函數引入

memoise <- memoize <- function(f) {n cache <- new_cache()nn memo_f <- function(...) {n hash <- digest(list(...))nnif (cache$has_key(hash)) {n cache$get(hash)n } else {n res <- f(...)n cache$set(hash, res)n resn }n }n attr(memo_f, "memoised") <- TRUEnreturn(memo_f)n}n

2). forget函數

  • 1. 檢查環境中,是否緩存了f函數
  • 2. 如果有f函數的緩存,則清空f函數的緩存值

forget <- function(f) {nif (!is.function(f)) return(FALSE)nn env <- environment(f)nif (!exists("cache", env, inherits = FALSE)) return(FALSE)nn cache <- get("cache", env)n cache$reset()nnTRUEn}n

3). 私有函數:new_cache函數

  • 1. 在new_cache函數里,定義cache對象,保存在env的環境中
  • 2. 通過new_cache函數,構造list類型對象,包括reset,set,get,has_key,keys方法
  • 3. 通過list對象,對cache對象進行訪問操作

new_cache <- function() {nn cache <- NULLn cache_reset <- function() {n cache <<- new.env(TRUE, emptyenv())n }nn cache_set <- function(key, value) {n assign(key, value, env = cache)n }nn cache_get <- function(key) {n get(key, env = cache, inherits = FALSE)n }nn cache_has_key <- function(key) {n exists(key, env = cache, inherits = FALSE)n }nn cache_reset()nlist(n reset = cache_reset, n set = cache_set, n get = cache_get,n has_key = cache_has_key,n keys = function() ls(cache)n )n

作者介紹:

張丹,R語言中文社區專欄特邀作者,《R的極客理想》系列圖書作者,民生銀行大數據中心數據分析師,前況客創始人兼CTO。

10年IT編程背景,精通R ,Java, Nodejs 編程,獲得10項SUN及IBM技術認證。豐富的互聯網應用開發架構經驗,金融大數據專家。個人博客 粉絲日誌, Alexa全球排名70k。

著有《R的極客理想-工具篇》、《R的極客理想-高級開發篇》,合著《數據實踐之美》,新書《R的極客理想-量化投資篇》(即將出版)。

《R的極客理想-工具篇》京東購買快速通道:《數據分析技術叢書:R的極客理想·工具篇》(張丹 )【摘要 書評 試讀】- 京東圖書

《R的極客理想-高級開發篇》京東購買快速通道:《R的極客理想 高級開發篇》(張丹)【摘要 書評 試讀】- 京東圖書

《數據實踐之美》京東購買快速通道:《數據實踐之美:31位大數據專家的方法、技術與思想》(天善智能)【摘要 書評 試讀】- 京東圖書

大家也可以加小編微信:tswenqu(備註:知乎),進R語言中文社區 交流群,可以跟各位老師互相交流。玩R的夥伴都在裡面的,一起進來多交流

官方公眾號:R語言中文社區 (ID:R_shequ) 歡迎關注,持續連載。
推薦閱讀:

細說Cache-L1/L2/L3/TLB
Web靜態資源緩存及優化
Linux查看cache信息
HTTP 緩存機制一二三
緩存級數是否有上限?

TAG:R编程语言 | 缓存 |