Рубрика «никто не читает теги»

Декодируем JPEG-изображение с помощью Python - 1

Всем привет, сегодня мы будем разбираться с алгоритмом сжатия JPEG. Многие не знают, что JPEG — это не столько формат, сколько алгоритм. Большинство JPEG-изображений, которые вы видите, представлены в формате JFIF (JPEG File Interchange Format), внутри которого применяется алгоритм сжатия JPEG. К концу статьи вы будете гораздо лучше понимать, как этот алгоритм сжимает данные и как написать код распаковки на Python. Мы не будем рассматривать все нюансы формата JPEG (например, прогрессивное сканирование), а поговорим только о базовых возможностях формата, пока будем писать свой декодер.
Читать полностью »

Влияние кризиса на IT: уволят ли нас всех - 1

Нередко вижу слова в духе «по другим отраслям коронавирус сильно ударил, а вот IT практически не затронул». Мол, веб-сервисы от карантина только выиграли, писать код можно и удалённо, а раз сейчас ограничения отменяют — значит, всё закончилось хорошо, проблем нет и теперь уже не будет.

По-моему, заявлять такое означает не вполне понимать ситуацию. Существует, например, прогноз Минкомсвязи, что российская IT-отрасль может стать убыточной, а численность российских айтишников во втором полугодии может снизиться на 27 000 человек. Понятия не имею, насколько оправдается конкретно этот прогноз, но поискал разные данные, и в целом они подтверждают: хотя IT и повезло больше многих, картина невесёлая, а уверенно говорить «всё осталось позади» рано.

Как всё могло ухудшиться в период, когда популярность онлайн-сервисов резко возросла? Как происходящее может сказаться на обычном айтишнике? И что ему делать, чтобы сказалось как можно меньше?

Читать полностью »

Производительность современной Java при работе с большим объёмом данных, часть 2 - 1

FYI: Первая часть.

Бенчмарк пакетного конвейера

Пакетный конвейер обрабатывает конечный объём сохранённых данных. Здесь нет потока результатов обработки, выходные данные агрегирующей функции нужно применить ко всему набору данных. Это меняет требования к производительности: задержка — ключевой фактор при потоковой обработке — здесь отсутствует, потому что мы обрабатываем данные не в реальном времени. Единственная важная метрика — общее время работы конвейера.

Поэтому мы выбрали Parallel. На первом этапе тестирования, при работе на одной ноде, этот сборщик действительно показал лучшую пропускную способность (но только после настройки). Однако это было получено ценой длительных пауз. Если одна из нод кластера останавливается на сборку мусора, это стопорит весь конвейер. А поскольку ноды собирают мусор в разное время, общее время сборки увеличивается с добавлением каждой ноды к кластеру. Мы проанализировали этот эффект, сравнив результаты тестирования на одной ноде и на кластере из трёх нод.

Кроме того, на этом этапе мы не рассматривали экспериментальные сборщики с низкой задержкой. Их очень короткие паузы не влияют на результаты тестирования, к тому же это достигается за счёт пропускной способности.
Читать полностью »

Дешёвый сервер из китайских запчастей. Часть 1, железная

Дешёвый сервер из китайских запчастей. Часть 1, железная - 1
Размытая кошка позирует на фоне настраиваемого сервера. На заднем плане – мышка на сервере

Привет!

В жизни каждого человека иногда назревает необходимость апгрейда компьютера. Иногда это покупка нового телефона взамен разбитого или в погоне за свежими андроидом или камерой. Иногда – замена видеокарты, чтобы тянула игру на минималках. Иногда – установка SSD в ноутбук, на который вы вкорячили десятую винду, а ей не очень нравится жить на Core2Duo и 2.5 гигабайтах адресуемой памяти, и она всё время выгружает неиспользуемые страницы в файл подкачки, изничтожая и без того не великую скорость обмена с 32-гиговым диском.

Моя история – апгрейд сервера, который был собран ещё на первом курсе института. Мои потребности за прошедшие шесть лет выросли, и он, конечно, получил прибавку как в оперативной памяти, так и в дисковой. Проблема в том, что с новыми знаниями были получены новые амбиции – желание применить эти знания на практике – и он с ними мог уже не совладать.

Сначала будет немного скучного вводного текста, а потом пойдут картинки.

Читать полностью »

SHISHUA: самый быстрый в мире генератор псевдослучайных чисел - 1

Полгода назад мне захотелось создать лучший генератор псевдослучайных чисел (ГПСЧ) с какой-нибудь необычной архитектурой. Я думал, что начало будет лёгким, а по мере работы задача станет медленно усложняться. И думал, смогу ли я научиться всему достаточно быстро, чтобы справиться с самым сложным.

К моему удивлению, сложность возрастала не линейно. Побайтовое тестирование по критерию хи-квадрат оказалось очень трудным! Позднее столь же трудно было пройти тесты diehard. Я опубликовал текущие результаты, чтобы понять, какие ещё трудности меня ожидают. Однако тест PractRand в тот раз пройти не удалось.

Затем было очень трудно прохождение теста BigCrush.

Затем было очень трудно передавать 32 тебибайта данных при прохождении PractRand. Скорость стала проблемой. Мало было создать конструкцию, генерирующей десять мегабайтов в секунду, потому что прохождение PractRand заняло бы месяц. Но должен признаться, что пройти этот тест со скоростью гигабайт в секунду было очень трудно.
Читать полностью »

Еще в декабре мне попалась одна совершенно замечательная статья на английском, посвящённая использованию системы типов языка для более широкого класса задач, для повышения надежности приложений и простоты рефакторинга. К сожалению, в тот момент я был слишком занят написанием статей по ФП, которые крайне важно было написать, пока свежи воспоминания. Но теперь, когда с этой задачей я справился, наконец дошли руки перевести эту замечательную заметку. Оригинальный язык примеров — Хаскель, но я решил переписать их на раст, для более широкого охвата аудитории. Однако, язык тут совершенно неважен, советы этой статьи я применяю в ежедневной разработке на вполне себе "приземлённых" C# и TypeScript, так что если вы просто стараетесь писать надёжный и поддерживаемый код, то, вне зависимости от языка, статья вам будет в тему.

Благодарю за вычитку и помощь в переводе Hirrolot, funkill и andreevlex

Парсите, а не валидируйте - 1

Читать полностью »

Разбираемся с алгоритмом коллапса волновой функции - 1

После появления DeBroglie и Tessera меня много раз просили объяснить, как они работают. Генерирование может выглядеть как волшебство, но лежащие в его основе правила на самом деле просты.
Читать полностью »

Мы стали старше, женатых/замужних стало в полтора раза больше (влюбленных на треть меньше), а число терпимых к алкоголю выросло на четверть.

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

Как изменились читатели за 5 лет? Или «280 недель спустя» - 1

Читать полностью »

Как реализованы конвейеры в Unix - 1

В этой статье описана реализация конвейеров в ядре Unix. Я был несколько разочарован, что недавняя статья под названием «Как работают конвейеры в Unix?» оказалась не про внутреннее устройство. Мне стало интересно, и я зарылся в старые источники, чтобы найти ответ.
Читать полностью »

Простая хэш-таблица для GPU - 1

Я выложил на Github новый проект A Simple GPU Hash Table.

Это простая хэш-таблица для GPU, способная обрабатывать в секунду сотни миллионов вставок. На моём ноутбуке с NVIDIA GTX 1060 код вставляет 64 миллиона случайно сгенерированных пар ключ-значение примерно за 210 мс и удаляет 32 миллиона пар примерно за 64 мс.

То есть скорость на ноутбуке составляет примерно 300 млн вставок/сек и 500 млн удалений/сек.

Таблица написана на CUDA, хотя ту же методику можно применить к HLSL или GLSL. У реализации есть несколько ограничений, обеспечивающих высокую производительность на видеокарте:

  • Обрабатываются только 32-битные ключи и такие же значения.
  • Хэш-таблица имеет фиксированный размер.
  • И этот размер должен быть равен двум в степени.

Для ключей и значений нужно зарезервировать простой разграничивающий маркер (в приведённом коде это 0xffffffff).
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js