Saya seorang pemula di dunia algoritma rotasi. Saya perlu meningkatkan algoritma pencadangan yang sudah ada yang ditulis dalam Java yang menangani pencadangan database dan pengarsipannya. Aspek penting dari algoritma ini adalah ia membaca file INI di mana Anda dapat menentukan hari apa dalam seminggu pengguna ingin membuat cadangan database mereka.
Misalnya. seperti ini: ScheduledWeekDaysAct=MON, TUE, WED, THU, FRI
atau ScheduledWeekDaysAct=TUE, FRI
Jadi, algoritma rotasi harus memperhitungkan bahwa cadangan dapat dibuat pada semua kombinasi hari. Itu berarti saya tidak bisa menggunakan algoritma Kakek-ayah-anak dengan mudah, yang sudah saya terapkan. Karena apa yang saya kodekan mengharapkan cadangan dibuat setiap hari sepanjang tahun dan itu tidak akan kompatibel dengan kode cadangan.
Untuk masalah ini terdapat ide algoritma, perilaku yang diharapkan tidak terlalu rumit, yaitu sebagai berikut:
- 10 (sepuluh) backup pertama yang terbaru harus selalu disimpan.
- After the most recent ten is kept, the rest older should be thinned. Not piece by piece, but by datetime. The date of the 10th oldest backup is a designated reference date, to which the older backups will be compared upon a new backup happens. Older backups should be kept and thinned something like the following.
After the 10th oldest backup there should be kept:
- 3 or 4 backups which are the newest on 3-4 prior weeks,
- 11 cadangan bulanan,
- 1 cadangan tahunan.
Saya tidak dapat menggunakan tanggal & waktu sistem, saya harus mengurai nama file cadangan. Namun pada akhirnya, tanggal pencadangan diberikan.
Pendekatan saya: Karena saya tidak tahu jadwalnya, pencadangan mana yang akan dilakukan pada hari apa, saya harus bekerja dengan interval, titik, garis tanggal. Saya perlu menentukan usia relatif dari cadangan setelah cadangan ke-10. Usia relatif ini didefinisikan sebagai perbedaan hari antara tanggal referensi sebenarnya (tanggal pencadangan terlama ke-10) dan tanggal pencadangan sebelum penyimpanan ke-10.
Saya bisa melakukan ini, saya membaca nama file, mengurai tanggal dari String
, mendapatkan Date
objek dari String yang diurai ini. Saya bisa memasukkannya ke Map<Path, Date>
(Nanti saya juga memerlukan fitur tanpa duplikat Set
untuk menghilangkan tanggal yang sama [mungkin ada beberapa database dengan tanggal yang sama tetapi nama berbeda]). Saya selalu bisa menentukan tanggal penyimpanan ke 10, sehingga saya bisa mendapatkan referensi objek Date
. Oleh karena itu saya selalu dapat menghitung usia relatif dari cadangan. Usia relatif dari cadangan bersifat unik dan saya dapat menyimpan usia relatif dengan Date
yang dihitung seperti ini TreeMap<Integer, Date>
.
Menurut saya, saya perlu bekerja dengan rentang usia relatif (keySet()
). Jika saya dapat menentukan usia relatif minimum dan maksimum dalam rentang usia relatif, saya kemudian dapat memfilter objek Date
yang direferensikan berdasarkan usia relatif. ( if relativeAge < 7
,if relativeAge >= 7 & relativeAge < 14
dan seterusnya.) Tapi saya juga harus memutar Dates
...
Saya tidak bisa memikirkan hal ini, ide apa pun dihargai. Terima kasih!
Sunting 1:
Pada dasarnya, masalahnya adalah sebagai berikut:
Saya memiliki daftar bilangan bulat. (Daftar usia relatif): [1, 3, 5, 8, 10, 12, 15, 17, 19, 22, 24, 26...]
Saya harus membuat batas bawah dan atas untuk membentuk kelompok bilangan bulat ini. Bilangan bulat, usia relatif bisa antara 0 & 7 atau 7 & 14, 14 & 21, 21 & 28, 28 & 56, 56 & 84 ... 336 & 364, dan bisa lebih besar dari 364. Saya harus mencari bilangan bulat yang termasuk dalam rentang ini masing-masing. Setelah saya menemukan kelompok bilangan bulat ini (suatu kelompok mungkin berisi 0, 1 atau lebih bilangan bulat), saya harus mengambil usia relatif tertinggi/tertua dalam rentang tertentu, kelompok. Jika kisarannya di atas 364, saya harus mempertahankan simpanan terendah, untuk menghentikan akumulasi simpanan tahunan. Saya harus mengumpulkan usia relatif tertinggi dalam rentang di atas dan ini akan membentuk kelompok usia relatif.
Usia relatif ini secara jelas merujuk pada tanggal file cadangan, jadi sekarang saya akan tahu tanggal/file mana yang menurutnya harus dipertahankan dalam rotasi sebenarnya.
Saya dapat menafsirkan gagasan usia relatif maksimum (maxRelAge) dalam rotasi tertentu, yaitu usia cadangan terlama dibandingkan dengan tanggal referensi sebenarnya.
Saya tidak perlu memeriksa rentang bilangan bulat di atas usia relatif maksimum. Setelah 1 tahun, algoritme akan berjalan sepenuhnya.
Tapi saya masih belum tahu cara mengkode algoritma ini di Java.