gpt4 book ai didi

r - 跟踪序列化对象的增量更改

转载 作者:行者123 更新时间:2023-12-04 06:05:43 25 4
gpt4 key购买 nike

这真的是出于纯粹的兴趣,我知道它甚至离高效还差得很远。

但是:是否可以在 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

现在我想知道跟踪哪些字节被改变的可行方法是什么(s.1 vs. s.2, s.2 vs. s.3)

最佳答案

所以看起来你需要定义两个函数,比如“vdiff”和“vpatch”(R中已经有一个“diff”函数,所以“vector diff”是我能想到的最好的)。

“vdiff”函数将分析两个向量并输出一堆替换。每次替换类似于“用 r 替换 x 的范围 b ”,因此两个整数(来自/长度)表示范围 r和一个字节向量 b .这包括三种情况:

  • x 中删除部分( b 为空)
  • 插入一个部分( r 的长度是 0 )
  • 替换一个部分( r 的长度是正数, b 是非空的)。

  • 每个替换可以表示为 list(from=6, length=2, bytes=11:14) , 并组合在一个列表中。
    vpatch函数将采用一堆替换并将它们应用于 x重新创建 y .

    现在, vdiff功能很复杂,我没有时间去实现它。在下面的示例中,我对其进行了硬编码以返回指定 x 的正确 diff 对象。和 y .

    ...我把它作为“读者的练习”来完全实现;-)
    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

    关于r - 跟踪序列化对象的增量更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8397878/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com