Форум сайта python.su
К слову, немножко смешная история о том, как в одной команде многоуровневый индекс строили: http://ivory.idyll.org/blog/mar-10/storing-and-retrieving-sequences
Офлайн
Большое спасибо, посмотрю.
Офлайн
По поводу кэша - теперь понятно. Пойду смотреть, что можно в Linux получить на эту тему. Надеюсь, в /proc есть всё-всё-всё.
Офлайн
я бы взял символ конца строки посложней и читал с конца. Например ‘;\n’
Офлайн
ZubchickТ.е. усложнить ненадежное условие в надежде, что вероятность ошибки сократится совсем незаметных величин?
я бы взял символ конца строки посложней и читал с конца. Например ‘;\n’
Офлайн
В задаче топикстартера подойдет и ‘\n’ с конца файла читать я почти уверен.
Но если усложнять до огромных объемов и юникода, то мой вариант проще чем индекс строить :) Хотя он и невозможен, если изначально логи написаны без ‘;’
Отредактировано (Ноя. 27, 2010 18:30:33)
Офлайн
Андрей СветловМама права =D
Для другой кодировки - иные правила. И я не уверен, что у всех кодировок ‘\n’ (байт с кодом 10) не сможет
встретится в середине символа. Эти китайцы - они такие странные люди, мне мама говорила.
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)
Стоит ли огород городить?
Офлайн
doza_andПопробую объяснить :) Мои предложения - реакция на ВашеSubideal OxЯ что-то не понял. Первая часть предложения - по поводу строка окажется длиннее. Она не окажется в силу заявленного ограничения (которое можно установить при записи лога). Но по-моему это не имеет отношения к делу.
Более того, в коде у doza_end строка может оказаться длиннее MAX_ROW и seek точно также может попасть в середину многобайтного символа (shit happens). То есть сивол выйдет поломанным - тоже мелочь, но неприятно. Соответственно, ‘rb’ в open - это совсем не решение обсуждаемой проблемы
Вторая половина предложения. Символ окажется поломанным. Запросто. Для работы алгоритма важно только чтобы ‘\n’ в двоичном потоке был валидным разделителем (те в имеющихся сообщениях не было внутри этого символа что конечно не всегда можно гарантировать). но если это так, то после разбиения строка правильно разрежется с нужным выравниванием (как мне кажется я это не проверял).
doza_andseek все равно, в каком режиме открыт файл - текстовом или бинарном - эта функция работает с байтами. Так что Ваш заход “все говно, а я д'Артаньян”, основанный на слишком вольном (точнее неверном) переводе документации, в этот раз не прошел ;) Хотя и вывел на интересное обсуждение, за что отдельное спасибо.
кстати - все открывают файл в текстовом режиме - в доке написано: seek для текстовых файлов дает непредсказуемый результат.
Офлайн
Ээээ. Кажется, уже все всё поняли.
Гордостью Королевских Мушкетеров никто себя не объявлял.
Прыгать через .seek по произвольному смещению в текстовых файлах и ожидать, что будет работать всегда - не стОит. Зависит от…
Надеюсь, все согласны.
Обсуждение получилось действительно интересным.
Меня, например, заставило еще раз взглянуть на связь символов-байтов.
Измерить скорость - результат вышел немного неожиданным. Я знал, что построчная вычитка файла в пару мегабайт очень быстрая. Теперь имею цифры.
Остался неисследованным еще один интересный аспект.
В python3 появился пакет io. Очень замечательный. open(…, ‘r’) и open(…, ‘rb’) возвращает на самом деле разные классы.
Я видел в рассылке питона обсуждения на эту тему - но сильно не вникал.
Берем текстовый режим.
Очень интересно, как операции на вложенном байтовом потоке могут повлиять на поток символов.
Офлайн