假设每天备份运行,我如何只用100个备份副本来保留最近1年的备份?

时间:2012-02-18 11:33:43

标签: ruby algorithm backup logic

假设我每天都创建一个备份副本,并假设每个备份都是一个压缩文件,并在其文件名中包含时间戳信息。

现在,我想编写一个每日运行脚本,删除旧备份并仅保留100个备份。然而,这100个备份分布在1年以上,这样我仍然有1年的副本,但是我应该有更多的最近备份副本和较旧的备份副本,即在任何给定时刻,两个幸存的连续备份之间的距离随着时间的推移,副本不断增加。

算法还应考虑到每天运行一次的事实。

此外,是否有此类算法的名称 - exponential range? exponential distance? non-linear backup expiry? logarithmic something? 什么?

如果你在答案中包含代码,我更喜欢Ruby(但不是必需的,因为我可以手动将其转换为Ruby,如果它是另一种语言的话)。

3 个答案:

答案 0 :(得分:2)

听起来你正在考虑像Tower of Hanoi这样的东西。磁带备份系统有时会将其用作管理备份磁带的方法。维基百科的文章有几种算法。当你学习递归时,它经常被用作编程练习。

游戏的基础是将一堆不同大小的磁盘从一个挂钩移动到另一个挂钩,而无需在较小的磁盘上放置更大的磁盘。如果你有五套磁带,标记为A到E,你最终会像这样移动它们。

ABA
CABA
DABACABA
EABACABADABACABA

最常使用的集合是E,所以如果你在1月1日开始使用E,那么你最终会这样。

E                    Jan 1
ABA                  Jan 2-4
CABA                 Jan 5-8
DABACABA             Jan 9-16
EABACABADABACABA     Jan 17-Feb 1

E套将于1月17日被覆盖。覆盖范围将于1月16日完成。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
E               D           C     B  A

A ruby program that solves the Tower of Hanoi puzzle

答案 1 :(得分:1)

让我描述一个可能适合您的非常简单的算法。

首先,每天指定一个全球约会对象,比如基督之后的天数。你想要红宝石,所以我告诉你如何在红宝石中做到这一点(这表明今天是734918天)

require "Date"
Date.today - Date.new(0)

现在让我告诉你你保留了哪些文件:保留过去30天内的所有文件,接下来的40个你保留每个文件的索引可以被2整除,对于接下来的80你保持每天的索引可被4整除,对于接下来的120,你保持每个文件的索引可被8整除,而对于其余的85/86,你保持每个文件的索引可被16整除。因此,随着时间的推移,你将需要检查是否需要删除一些存储的文件,永远不需要显示已经删除的文件。如果你需要这个逻辑的代码,请告诉我。

答案 2 :(得分:1)

保留过去两个月的所有内容以及去年的每个星期日备份都会导致100多个文件。易于解释,易于执行,如果有备份,您事先就知道了。 未测试的:

require 'date'
def bup_name(date=Date.today)
  "#{date.to_s}.bup"
end
def delete(fname)
  #todo: exception handling
  File.delete(fname) if File.exist?(fname)
end

today = Date.today
# make backup bupname(today)
delete( bup_name( today << 12 ))
two_months_ago = today << 2
delete( bup_name( two_months_ago )) unless two_months_ago.sunday?