Как сохранить резервную копию за последний год только с 100 резервными копиями, если резервное копирование выполняется каждый день? - PullRequest
2 голосов
/ 18 февраля 2012

Предполагая, что я создаю резервную копию каждый день, и предполагая, что каждая резервная копия представляет собой один сжатый файл и содержит информацию о метке времени в своем имени файла.

Теперь я хочу написать ежедневный скрипт, который удаляет старые резервные копии и хранит только 100 резервных копий. Тем не менее, эти 100 резервных копий распределяются в течение 1 года, так что у меня все еще есть годичная копия, однако у меня должно быть больше копий недавних резервных копий и меньших копий старых резервных копий, т.е. в любой момент времени расстояние между двумя оставшимися в живых последовательными резервными копиями копии продолжают расти, когда мы возвращаемся в прошлое.

Алгоритм также должен учитывать тот факт, что он будет запускаться один раз в день.

Кроме того, есть имя для такого алгоритма - exponential range?, exponential distance?, non-linear backup expiry?, logarithmic something? что-нибудь?

Если вы включаете код в свой ответ, я бы предпочел Ruby (но не обязательно, поскольку я могу вручную скомпилировать его в Ruby, если он написан на другом языке).

Ответы [ 3 ]

2 голосов
/ 18 февраля 2012

Звучит так, будто вы думаете о чем-то вроде Ханойской башни .Системы резервного копирования на магнитную ленту иногда используют это как способ управления лентами резервного копирования.В статье Википедии есть несколько алгоритмов.Он часто используется как упражнение по программированию, когда вы изучаете рекурсию.

Игра основана на перемещении стопки дисков разных размеров с одного колышка на другой, даже не помещая больший диск поверх меньшего.Если бы у вас было пять комплектов лент, помеченных буквами от A до E, вы бы в итоге переместили их следующим образом.

ABA
CABA
DABACABA
EABACABADABACABA

Набор, который используется реже всего, это E, поэтому если вы начнете с E 1 января,ты будешь таким.

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

Набор E будет перезаписан 17 января. Покрытие будет выглядеть так 16 января.

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

Рубиновая программа, решающая головоломку Ханойской башни

1 голос
/ 18 февраля 2012

Сохранение всего за последние два месяца и каждое воскресное резервное копирование за последний год приведет к чуть более 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?
1 голос
/ 18 февраля 2012

Позвольте мне описать очень простой алгоритм, который может работать на вас.

Прежде всего, назначьте каждый день глобальный счетчик дат, скажем, число дней после Христа.Вы хотели ruby, поэтому я покажу вам, как это сделать в ruby ​​(это показывает, что сегодня 734918-й день)

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

Теперь позвольте мне сказать, какие файлы вы храните: Вы сохраняете все файлы из последних 30дней, в течение следующих 40 вы сохраняете каждый файл с индексом, кратным 2, в течение следующих 80 вы сохраняете каждый день с индексом, кратным 4, в течение следующих 120 вы сохраняете каждый файл с индексом, делимым на 8, а для остальных 85/86вы сохраняете каждый файл с индексом, делимым на 16. Таким образом, с течением времени все, что вам нужно, это проверить, нужно ли вам удалить некоторые из сохраненных файлов, и вам никогда не потребуется показывать файл, который вы уже стерли.Скажите, если вам нужен код для этой логики тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...