最も人気のある今日、今週、今月の 3 つのフィールドのいずれかで順序付けされたエントリを表示するシステムがあります。エントリが表示されるたびに、スコアが 1 ずつ増加するため、順序が変更されます。
したがって、エントリ 1 が新しく、今日 10 回表示された場合、そのスコアは次のようになります。
Today: 10
Week: 10
Month: 10
現在のソリューション
現時点では、各エントリに 3 つのフィールドが関連付けられています。1 つは今日用、もう 1 つは今週用、もう 1 つは今月用です。エントリが表示されるたびに、3 つのスコアすべてが 1 ずつ増加します。
その日の終わりに、その日のスコアは 0 にリセットされます。現在の週の終わりに、その週のスコアは 0 に設定され、現在の暦月の終わりに、その月のスコアは 0 に設定されます。
問題
これは機能し、ほとんどスペースを使用しませんが、次の 2 つの理由から理想的ではありません。
1) 現在の期間 (日、週、月) の終わりに、その値は一度に 0 にリセットされます。つまり、毎日 00:00:00 にランキングがすべてリセットされ、すべての毎日のスコアが 0 に設定されます。週末と月末も同様です。毎月 1 日の 00:00:00 にすべてのスコアが 0 に設定され、既存のランキング データがすべて失われます。
2) 通常、月末は 1 週間 (月~日) に含まれるため、月間スコアはその週にリセットされ、週間スコアが月間スコアよりも高くなります。
考えられる解決策
現在の時間インデックスに基づいて現在の日、週、月のスコアを計算するために使用される、月のすべての時間にローリング時間カウンターを使用できます。
Array size = 31 * 24 = 744 int16 values
したがって、1 日の午前 4 時のビューは時間単位で配置されます[4]。
hours[4]++
次に、統計計算機は今日を最後の 24 値の合計として使用し、今週のスコアは最後の (24*7) 値の合計になります。最後に、今月は最後の (24*31) 値の合計になります。
ソリューションの問題
ソリューション 1 の主な問題は、ディスク/メモリの要件です。現在のソリューションでは 3 つの 32 ビット値を使用していましたが、744 個の 32 ビット値を使用するようになりました。それらをin16に変更しても、エントリごとにより多くのメモリを使用することになります
Memory per Entry = 3 * 4 bytes = 12 bytes (Existing)
Memory per Entry = 744 * 2 = 1,488 bytes (possible solution)
このソリューションにより、エントリごとのメモリ使用量が 12400% 跳ね上がりました!!
エントリごとに 1.5k を使用せずに、現在のソリューションの問題を解決する別のソリューションを誰かが提案できますか?
どうもありがとう!