Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 27, 2010 09:35:39

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Быстрый способ прочитать последнюю строку в файле

К слову, немножко смешная история о том, как в одной команде многоуровневый индекс строили: http://ivory.idyll.org/blog/mar-10/storing-and-retrieving-sequences



Офлайн

#2 Ноя. 27, 2010 09:38:18

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Быстрый способ прочитать последнюю строку в файле

Большое спасибо, посмотрю.



Офлайн

#3 Ноя. 27, 2010 09:48:23

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Быстрый способ прочитать последнюю строку в файле

По поводу кэша - теперь понятно. Пойду смотреть, что можно в Linux получить на эту тему. Надеюсь, в /proc есть всё-всё-всё.



Офлайн

#4 Ноя. 27, 2010 15:28:51

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Быстрый способ прочитать последнюю строку в файле

я бы взял символ конца строки посложней и читал с конца. Например ‘;\n’



Офлайн

#5 Ноя. 27, 2010 17:14:17

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Быстрый способ прочитать последнюю строку в файле

Zubchick
я бы взял символ конца строки посложней и читал с конца. Например ‘;\n’
Т.е. усложнить ненадежное условие в надежде, что вероятность ошибки сократится совсем незаметных величин?
Путем некоторого усложнения алгоритма?

Да, чтение с хвоста быстрее. Сильно быстрее - раз в 30 на заданных 25 тыс строк.
Теперь смотрим, что это означает.
“Тупой” подход обрабатывает за 3 мс.
Чтение с хвоста - 0.1 мс.

Таймер в GUI клацает не чаще раза в 50 мс.
Квант времени между переключением потоков 10 мс, само переключение занимает 0.01 мс.

Получается, 3 мс - это уже очень мало. И дальнейшее ускорение мало кто заметит. Тем более чтение логов - не самая распространенная операция.
Эффект не сравним с ускорением шаблонного движка на 10%.



Офлайн

#6 Ноя. 27, 2010 18:29:27

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Быстрый способ прочитать последнюю строку в файле

В задаче топикстартера подойдет и ‘\n’ с конца файла читать я почти уверен.
Но если усложнять до огромных объемов и юникода, то мой вариант проще чем индекс строить :) Хотя он и невозможен, если изначально логи написаны без ‘;’



Отредактировано (Ноя. 27, 2010 18:30:33)

Офлайн

#7 Ноя. 28, 2010 17:43:24

Subideal Ox
От:
Зарегистрирован: 2010-11-23
Сообщения: 65
Репутация: +  0  -
Профиль   Отправить e-mail  

Быстрый способ прочитать последнюю строку в файле

Андрей Светлов
Для другой кодировки - иные правила. И я не уверен, что у всех кодировок ‘\n’ (байт с кодом 10) не сможет
встретится в середине символа. Эти китайцы - они такие странные люди, мне мама говорила.
Мама права =D
for hglyph in xrange(0x4e00, 0x9fa6):
if bytearray('\n') in bytearray(unichr(hglyph), encoding='utf-16'):
print unichr(hglyph),
Андрей Светлов
Стоит ли огород городить?
Воистину: “We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil” (Knuth)

=D

SO



Офлайн

#8 Ноя. 28, 2010 19:19:38

Subideal Ox
От:
Зарегистрирован: 2010-11-23
Сообщения: 65
Репутация: +  0  -
Профиль   Отправить e-mail  

Быстрый способ прочитать последнюю строку в файле

doza_and
Subideal Ox
Более того, в коде у doza_end строка может оказаться длиннее MAX_ROW и seek точно также может попасть в середину многобайтного символа (shit happens). То есть сивол выйдет поломанным - тоже мелочь, но неприятно. Соответственно, ‘rb’ в open - это совсем не решение обсуждаемой проблемы
Я что-то не понял. Первая часть предложения - по поводу строка окажется длиннее.  Она не окажется в силу заявленного ограничения (которое можно установить при записи лога). Но по-моему это не имеет отношения к делу.
Вторая половина предложения. Символ окажется поломанным. Запросто. Для работы алгоритма важно только чтобы ‘\n’ в двоичном потоке был валидным разделителем (те в имеющихся сообщениях не было внутри этого символа что конечно не всегда можно гарантировать). но если это так, то после разбиения строка правильно разрежется с нужным выравниванием (как мне кажется я это не проверял).
Попробую объяснить :) Мои предложения - реакция на Ваше
doza_and
кстати - все открывают файл в текстовом режиме - в доке написано: seek для текстовых файлов дает непредсказуемый результат.
seek все равно, в каком режиме открыт файл - текстовом или бинарном - эта функция работает с байтами. Так что Ваш заход “все говно, а я д'Артаньян”, основанный на слишком вольном (точнее неверном) переводе документации, в этот раз не прошел ;) Хотя и вывел на интересное обсуждение, за что отдельное спасибо.



Офлайн

#9 Ноя. 28, 2010 20:05:10

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Быстрый способ прочитать последнюю строку в файле

Ээээ. Кажется, уже все всё поняли.
Гордостью Королевских Мушкетеров никто себя не объявлял.
Прыгать через .seek по произвольному смещению в текстовых файлах и ожидать, что будет работать всегда - не стОит. Зависит от…
Надеюсь, все согласны.

Обсуждение получилось действительно интересным.
Меня, например, заставило еще раз взглянуть на связь символов-байтов.
Измерить скорость - результат вышел немного неожиданным. Я знал, что построчная вычитка файла в пару мегабайт очень быстрая. Теперь имею цифры.
Остался неисследованным еще один интересный аспект.
В python3 появился пакет io. Очень замечательный. open(…, ‘r’) и open(…, ‘rb’) возвращает на самом деле разные классы.
Я видел в рассылке питона обсуждения на эту тему - но сильно не вникал.
Берем текстовый режим.
Очень интересно, как операции на вложенном байтовом потоке могут повлиять на поток символов.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version