2011-12-06 18 views
2

這確實沒有純粹的興趣,我知道它甚至沒有接近高效。跟蹤序列化對象的增量更改

但是:是否有可能跟蹤R中的序列化對象的增量更改,以便我只需要在每次更改時保存增量而不是整個對象,然後通過將增量信息拼接在一起來檢索「完整」對象?這可能沒有任何意義,因爲重新序列化整個對象會更便宜,但我只是想擴大我的視野;-)

我不是很熟悉原始矢量,二進制格式等,但不備份軟件,例如,做這樣的事情(增量備份)?

我這是怎麼走到這一步,

x.1 <- 1 
s.1 <- serialize(x.1, connection=NULL) 
x.2 <- c(x.1, 2) 
s.2 <- serialize(x.2, connection=NULL) 
x.3 <- x.2 
x.3[2] <- 99 
s.3 <- serialize(x.3, connection=NULL) 

> s.1 
[1] 58 0a 00 00 00 02 00 02 0e 00 00 02 03 00 00 00 00 0e 00 00 00 01 3f f0 00 
[26] 00 00 00 00 00 
> s.2 
[1] 58 0a 00 00 00 02 00 02 0e 00 00 02 03 00 00 00 00 0e 00 00 00 02 3f f0 00 
[26] 00 00 00 00 00 40 00 00 00 00 00 00 00 
> s.3 
[1] 58 0a 00 00 00 02 00 02 0e 00 00 02 03 00 00 00 00 0e 00 00 00 02 3f f0 00 
[26] 00 00 00 00 00 40 58 c0 00 00 00 00 00 

現在我不知道什麼是跟蹤,其中字節被修改了一條可行的途徑(補主場迎戰第2節,第2節與s3)

回答

3

所以你似乎需要定義兩個函數,比如說「vdiff」和「vpatch」(R中已經有一個「diff」函數,所以「vector diff」是我所能做到的最好的拿出)。

「vdiff」函數將分析兩個向量並輸出一堆替換。每個替換將類似於「將x的範圍r替換爲b」,因此兩個整數(來自/長度)表示範圍r和字節向量b。這涵蓋三種情況:

  1. x刪除部(b爲空)
  2. 插入部(r的lentgh是0
  3. 替換部(r的長度爲正,且b是非空的)。

每個替換可以表示爲list(from=6, length=2, bytes=11:14),並在一個列表中分組在一起。

vpatch函數將採取一堆替換,並將它們應用於x重新創建y

現在,vdiff功能很複雜,我沒有時間去實現它。在下面的示例中,我對它進行了硬編碼,以便爲指定的xy返回正確的差異對象。

...我把它作爲 「一個練習留給讀者」,然而,全面執行;-)

vpatch功能齊全:

# Dummy hard-coded function 
vdiff <- function(x,y) { 
    list(list(from=1, length=0, bytes=as.raw(101:103)), 
     list(from=7, length=3, bytes=raw()), 
     list(from=11, length=0, bytes=as.raw(111:113))) 
} 

vpatch <- function(x,d) { 
    for (r in d) { 
     pre <- if (r$from == 1) raw(0) else x[1:(r$from-1)] 
     post <- if (r$from > length(x)) raw(0) else x[(r$from+r$length):length(x)] 
     x <- c(pre, r$bytes, post) 
    } 
    x 
} 

# Sample vectors 
x <- as.raw(1:10) 
y <- as.raw(c(101:103, 1:3, 7:10, 111:113)) 

d <- vdiff(x,y) # Create diff from x to y 
y2 <- vpatch(x, d) # Apply diff to x to get y 
identical(y, y2) # TRUE 
+0

酷,謝謝!我會稍微玩一下,然後在這裏找回結果 – Rappster