July 13th, 2014

404

Отлов словарей

Вся суть проблемы сводится к отлову цельных словарей. О чём речь?

Вот, так выглядит условный итератор.

class JStore:
    def __init__(self, iterator):
        self.value = None
        self.iterator=iterator

    def __iter__(self):
        self.iterator=self.iterator.__iter__()
        return self

    def next(self):
        e=self.iterator.next()
        self.value =  self.add(self.value, e[0], e[1])
        return self.value


Collapse )
404

всё лучше и лучше

    def __iter__(self):
        return self.yielder()

    def yielder(self):
        for e in self.iterator():
            self.value =  self.add(self.value, e[0], e[1])
            if len(self.value) > 1:
                yield self.value.pop(0)
        yield self.value.pop(0)


Выглядит очень питонистически. Работает почти как часы. Единственная проблема - хвост json'а, когда после него сразу следующий json. При ближайшем расмотрении, дело не в том, как я yield'жу, а в том, что следующее значение полностью затирает предыдущие. То есть мне присылают (), [] - и я радостно херю всё, что было хорошего в self.value до сих пор.

Решение простое, кстати. Даже без хаков в районе self.add, как я думал сначала. Надо просто отлавливать этот момент и возвращать хвост старого значения.

(задумчиво) если я решу когда-то оптимизировать скорость, это отличное место - можно yield'ить за раз больше одного словаря. То есть читаем пачку, потом yield'им.

А вот и цифры:

30000 списков, по три словаря в каждом, по три значения в каждом словаре - 13.2с. То есть 430 µs на словарь, 150 µs на значение. На человеческий счёт - 2600 простых словарей в секунду. Не густо, конечно, но для первого приближения сойдёт.

Собственно, сам код: https://github.com/amarao/json4shell/blob/jsonstream/tools/dictyield.py
404

JSONStream

Внезапно, я погорячился. Простейший эксперимент со stacked json показывает, что он нифига не stateless и нифига не константный по памяти.

Поток мелких json'ов на входе - и я уже лицезрею 400+ Мб у python. Плохо...

115Mб json'ов отъедают вместе 362Мб. Если исходить из этой пропорции, то получается, что при техническом разумном лимите в 256Мб на утилиту, лимит самой утилиты будет порядка 82 Мб. С одной стороны для бытовых нужд достаточно, с другой стороны, представляю себе, как будет материться человек, обнаруживший, что ему нужно 300+ Гб памяти, чтобы обработать 100Гб файл... При обещанной-то потоковости.

То есть это баг, и хоть и не фатальный, но баг, который надо будет изживать. Либо я не так готовлю сам JOSNStream, либо его придётся переписать (фатальный недостаток, ога), либо поднять багу.

Багу, кстати, сейчас подниму. https://github.com/nigelsmall/jsonstream/issues/1
404

(no subject)


угомонистические идеи воспитательницы оказались бессильны против гомонистических настроений детворы. Пришлось прибегнуть к негуманистическим методам.

404

чудеса апстрима

Сегодня ночью отсылаю багрепорт, просыпаюсь, проблема решена.

Итого: 1.8Гб json, 5Мб памяти на парсинг, константно. Но скорость в 1Мб/с парсинга (100% CPU от i5/haswell) всё-таки смущает. Для сравнения, регэксповый греп даёт 100Мб/с, а fgrep и вовсе 400.
404

онгоинг Aldonah Zero (2)

Ок, товарищи получают большой жирный плюс за то, что первыми целями ракетам, выпущенных при нападении, стали не боевые корабли, а подводные кабели, коммуникационные узлы, спутники и прочие элементы связи. Маленький минус ставим за изображение светлого доброго будущего, где все умирают только от рук меха и космических кораблей, с windows phone на телефонах.

Второй минус (инерция сознания, да), это показ новостей сразу после такой атаки. Чем новости вещать-то? Ну и переговоры по телефону тоже. Недотягивают до честной симуляции...

Кроме того, помимо сцены всеобщего разгрома (что будет, если столкнуть современную десантную роту с поддержкой авиации и артиллерии против древней фаланги?), война пока что не выглядит интересно. Ну и сценарий, который полагает, что после того, как армию позорно разгромили, одинокий школьник спиздит гандам и вот тогда... Ой, кажется, у них есть шансы, и неплохие.

...уровень "неинтересности" тут классом выше соседних меха, так что смотрим дальше.
404

mypaint

Освоил simmetric painting. Крайне полезная штука для геометрических фигур. Потому что иначе догадаться, что у тебя левая половинка короче, чем правая, не получается. Вроде одинаково - а выглядит криво. Начинаешь в simmetric обводить, ага, вот эта дуга-то другого размера, а дальше всё правильно...
404

онгоинг bakaramon (2)

Huge pile of cuteness and motivation.

Смотреть. Оно реально хорошо, неизбито и полно жизнерадостных садомазохистских лоли моментов жизни.

Но главное, это такая добрая мотивационная часть. С учётом адской прорвы спокона и почти полного отсутствия подобного для не-физической активности, редкий самоцвет.