MutedReported сказал(а):
↑ Да нет, вот у меня задача - 1ый запрос получает создает большое количество объектов, а 2ой запрос читает потом стату по ним за последнюю минуту(а так как старые данные уже не нужны, мне нет смысла расширять память для мусора). То-есть скармливать обычной структуре - память растет. А нужна такая структура, которая позволяет с О(1) памятью работать с большим количеством транзакций вне зависимости от количества этих данных.
Нажмите, чтобы раскрыть...
1. кольцевой буфер любит больше быть пустым, чем полным, если данных разное количество, прийдется его прилично увеличивать (хотя бы в 2 раза)
2. Если 2-й запрос зависит от первого, типа (аналог чата) прочли идшники сообщений 1-м и загрузили сообщения вторым, то логичнее делать кольцо с FILO с контролем времени при добавлении. Понадобится как хранилище вектор. Показываю:
Цитата:
class Item: data: str timestamp: datetimeclass Ring2: PRELOAD = 5 def __init__(self, t_cutoff): self.t_cutoff = t_cutoff self.data = [] * self.PRELOAD def get(self) -> Item: return self.data.pop() def set(self, v: Item): # тупой перебор now = datetime.now().timestamp() for k, i in enumerate(self.data): if now - i.timestamp.timestamp() > self.t_cutoff: self.data.pop(k) # можно через фильтр self.data = list(filter(lambda x: now - i.timestamp.timestamp() < self.t_cutoff, self.data)) # можно через while, учитывая что все елементы упорядочены по времени i = 0 while now - self.data.timestamp.timestamp() > self.t_cutoff: self.data.pop(i) return self.data.pop() @property def lenght(self) -> int: return len(self.data)
Нажмите, чтобы раскрыть...
Если меток времени нет, то аналогично делаешь хранилище меток и по ним строишь офсеты. Чисто опционально, если ты знаешь среднее время между сообщениями, можно подобрать очередь необходимой длинны (примерно), тогда она сама будет очищаться (для этого юзают или PriorityQueue, или dequeue (она обычно по размеру ставится)
Мой пример использует просто массив что бы ты понял логику.
MutedReported сказал(а):
↑ Нажмите, чтобы раскрыть...
Не новички знают как написать кольцевой буфер, не надо мне врать.