January 4th, 2010

I do IT

Всем бездельникам

С 1-го по 13-е, говорите? Себе хуже делаете, товарищи. Кто не повредит печень - тот замерзнет, кто избежит первых двух бед - останется с мозгами, промытыми телевизором, кто убережется и от этого - ну да, прокачает своего эльфа до 89 уровня. Дело, конечно, полезное, но... грустно всё это.

Я вот занялся полезными вещами. Решил попрограммировать и воплотить в жизнь те идеи, на которые не хватало времени в конце прошлого года. В частности, решил улучшить качество нашей системы оповещений о стихийных бедствиях для пользователей iPhone и нашей программы StormAlert.
Суть такая: клиенты стали жаловаться, что не получают каких-то предупреждений, о которых узнают в последствии из СМИ. Мы стали смотреть, в чем дело. Выянилось, что мы оперируем географическими координатами, в то время, как информация о прогнозах размещается для т.н. forecast zones - зон, на которые поделена территория США. Информация эта доступна из разных источников, мы планируем к ним подключиться, но для начала нужно решить проблему привязки существующих Favorite Locations наших клиентов к этим самым зонам. Удалось найти данные о географической привязке зон, но... формат оказался существенно бинарным, и я допустил первую ошибку.
Я решил, что нет ничего лучше использования существующих велосипедов, и конвертировал проприетарный бинарный формат в XML-style XLS. Размер файла увеличился в 10 раз (до 186 МБ), и я решил, что буду работать с ним. Это была вторая ошибка. Урок, который я извлек для себя: никогда не работайте с большими объемами XML-данных, если цените свое и процессорное время. Я написал довольно простой код, максимально оптимизировал его, мне не нужно было искать по этому гигантскому файлу, я работал с данными последовательно, но... первоначальная оценка времени, требуемого для загрузки всего объема данных в SQL2008 оказалась равна 5-6 дням. После 12 часов работы оценка увеличилась до 25 дней непрерывной работы приложения. Performance Analyzer показал, что 99.5% времени тратится на разворачивание XML (это при том, что весь файл загрузился в RAM, pagefile у меня отключен и всё операции осуществлялись в быстрой DDR2!). Я предпринял пару попыток декомпозиции задачи, но результат оказался столь же печальным.
Пришла мысль, что я поехал не на том велосипеде. Человечество изобрело множество велосипедов - трехколесные, горные, ВМХ, тандемы. Моя же первая попытка заключалась в попытке проехать Tour de France верхом на велотренажере Кеттлер. Судя по скорости. В общем, я решил пересесть на шоссейник. 50 строк кода с чистого листа, использование библиотеки для чтения бинарика с использованием индексов - и - данные оказались в базе за 1 минуту. Процент ошибок из-за некорректных данных - 10%. Много, но как мне кажется, терпимо. Что-нибудь придумаем.

Программировать прикольно:)

Всем желаю отдохнуть деятельно! Не теряйте время! Carpe diem!