我正在开发一个参考实现,它实现了一个类似于duplicati的细化机制,该机制可以根据年龄删除备份。回溯时间,它在不断增长的时间范围内建立备份之间的最小时间差。此算法由用小型语言编写的保留策略控制<frame1>:<limit1>,<frame2>:<limit2>,...,<frameN>:<limitN>
例如,"1D:3h,1W:1D,3M:1W"
表示
由于增量过程,可以“优化”此迷你语言中的“程序”:
"4W:2D,4W:1D"
转化为"4W:2D"
应用规则#1 x:a,x:b => x:a
"2W:2D,4W:2D"
转化为"4W:2D"
应用规则#2 a:x,b:x => max(a,b):x
"2W:2D,4W:1D"
转化为"4W:2D"
应用规则#3 a:x,b:y => max(a,b):x (if x >= y)
规则3是关于连续的时间框架(a < b
),首先应用更严格的限制(x
)。极限是绝对距离,而不是频率,因此(x > y
)意味着x
比y
更具限制性。
如规则1所示,仅应用两个相同帧细化级别中的第一个。我选择了限制最少的那个。因此,可以对细化策略进行预处理,将成对的排序列表(帧,限制)减少到具有最低限制的每个帧的排序列表(我用数字替换时间增量):
user_input = [(30, 3), (20, 4), (20, 5), (10, 1), (10, 2)]
expected_output = [(10, 1), (20, 4), (30, 3)]
到目前为止,我的情况是:
def normalized(thinning):
thinning = sorted(thinning)
deduped = []
key = None
for t in thinning:
if t[0] != key:
deduped.append(t)
key = t[0]
thinning = deduped
return thinning
有没有一个明显的方法可以导致一个更紧凑的版本(也许不那么程序化)?你知道吗
[1]在流程开始时,所有备份都收集在待办事项列表中。这个列表是按时间顺序排列的。现在细化策略应用于时间帧的时间帧(最小优先):每个时间帧从待办事项列表中选择(并删除)时间戳。你知道吗
您可以在此处使用^{} :
相关问题 更多 >
编程相关推荐