Могу ли я улучшить скорость произвольного доступа в ограниченную длину (круговой буфер) в Python? - PullRequest
0 голосов
/ 21 июня 2011

Я работаю над написанием небольшой программы очистки журнала на 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

1 Ответ

2 голосов
/ 21 июня 2011

Как и во всех двойных списках, произвольный доступ в collections.deque равен O (n). Подумайте об использовании списка ограниченных списков, чтобы очистка старых записей (del outer[0]) все еще могла выполняться своевременно, даже с сотнями тысяч записей.

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