Я работаю над написанием небольшой программы очистки журнала на Python, которая обрабатывает непрерывный файл журнала и сохраняет смещения в файле для интересующих строк.
Мое оригинальное решение работало довольно быстро на больших файлахно у меня не было метода очистки хранилища, что означало бы, что если программа продолжит работать, использование памяти будет постоянно увеличиваться, пока программа не израсходует всю доступную ей память.Мое решение состояло в том, чтобы использовать collections.deque
с maxlen
, установленным так, чтобы список работал как кольцевой буфер, отбрасывая самые старые журналы по мере поступления новых данных.
Хотя это устраняет проблему с памятью, я сталкиваюсьс большой потерей производительности при вызове элементов из очереди по индексу.Например, этот код работает намного медленнее, чем старый эквивалент, где self.loglines не был deque.Есть ли способ улучшить его скорость или создать кольцевой буфер, где произвольный доступ - это операция с постоянным временем (вместо, я полагаю, O (n))?
def get_logline(self, lineno):
"""Gets the logline at the given line number.
Arguments:
lineno - The index of the logline to retrieve
Returns: A string containing the logline at the given line number
"""
start = self.loglines[lineno].start
end = self.loglines[lineno+1].start
size = end - start
if self._logfile.closed:
self._logfile = open(self.logpath, "r")
self._logfile.seek(start)
logline = self._logfile.read(size)
return logline