Вы можете, конечно, запустить профилировщик, чтобы выяснить, что именно занимает время. Даже у планировщика есть информация профилирования, хотя и не такая доступная.
Скорее всего, уходит время на сканирование всей информации о файлах для множества файлов на S3. Dask должен перечислить все эти файлы, чтобы выяснить, насколько они велики, и назначить блоки для чтения, которые требуют много медленных HTTP-вызовов.
Это, в свою очередь, создает очень большое количество задач, как вы уже нашли. Общий график задач должен быть сериализован и отправлен планировщику для выполнения, а затем обработан планировщиком и отправлен работникам. Чем больше график, тем больше складываются эти затраты.
Короче говоря, если вы хотите оптимизировать скорость передачи данных, вам лучше разделить входящие данные на гораздо большие куски. Вы увидите некоторые рекомендации по размерам порций данных порядка 100 МБ.
Проблемы с DAO, которые я видел, состоят в том, что они обычно работают с полными объектами все время. Это создает совершенно ненужные накладные расходы, которых не было бы при простых запросах. Например, если из справочных данных базы данных должен быть создан раскрывающийся список, пользователь DAO может просто сказать: «Получите мне коллекцию объектов для этой таблицы, где y упорядочено по z». Затем эти данные используются в раскрывающемся списке, но обычно только для комбинации ключ / значение, игнорируя все остальное в объектах (созданные данные, последний пользователь, который обновил их, независимо от того, активны они или нет) и которые были извлечены и сопоставлены. , Даже если это массирование происходит рядом с вызовом DAO, и объекты не сохраняются при получении (что, как правило, не так, к сожалению, объекты часто заключаются в ac: forEach (JSP) и повторяются для получения раскрывающегося списка). ), он по-прежнему создает ненужные ресурсы базы данных и сети, не говоря уже о временном увеличении памяти для хранения этих объектов.
Теперь, это не значит, что DAO не может быть спроектирован для извлечения Карты справочных данных - это, безусловно, может. Но обычно они используются для полного сопоставления объектов, что не всегда необходимо. Это сила при сохранении, но слабость, IMO, при извлечении данных - конечно, вы получаете все это - но часто вам не нужно все это, и это просто тратит впустую память, пропускную способность и время.
Шаблон проектирования DAO или объекта доступа к данным - хороший пример принципов, ориентированных на абстракцию и инкапсуляцию. Он разделяет логику персистентности - это отдельный уровень, называемый уровнем доступа к данным, который позволяет приложению безопасно реагировать на изменения в механизме персистентности. Например, если вы переключитесь с механизма персистентности на основе файлов на базу данных, ваше изменение будет ограничено уровнем доступа к данным и не повлияет на объекты сервисного уровня или домена. Объект доступа к данным или шаблон DAO в значительной степени стандартны в Java-приложении, будь то ядро Java, веб-приложение или корпоративное приложение. Ниже приведены еще несколько преимуществ использования шаблона DAO в приложении Java:
Шаблон проектирования DAO также поддерживает связь. низкий между различными частями приложения. Используя шаблон проектирования DAO, ваш уровень просмотра полностью независим от уровня DAO, и от него зависит только уровень сервиса, который также абстрагируется с помощью интерфейса DAO.
Шаблон проектирования DAO позволяет выполнять тест JUnit быстрее, поскольку он позволяет создавать Mock и избегать подключения к базе данных для запуска тестов. Это улучшает тестирование, потому что написать тест с объектами Mock проще, чем тест интеграции с базой данных. В случае возникновения каких-либо проблем во время выполнения модульного теста вам нужно только проверять код, а не базу данных. Также щиты с проблемами подключения к базе данных и окружающей среды.
Поскольку шаблон DAO основан на интерфейсе, он также поддерживает принцип объектно-ориентированного проектирования «программирование для интерфейса, а не для реализации», что приводит к гибкому и качественному коду.
Мы увидели некоторую реальную пользу от внедрения шаблона DAO в нашу реализацию. Это связано главным образом с четким разделением между интерфейсом базы данных и реализацией. Мы наблюдали следующие преимущества:
Одной из проблем, с которой мы столкнулись, и это может быть связано с отсутствием ясности дизайна с нашей стороны, является «склонность» повторно использовать Объекты Значения Данных, опубликованные вне базы данных, как Объекты Передачи между последующей абстракцией. слои в архитектуре. Нашим решением после некоторой боли было создание объекта значения на слой (то есть, чтобы не использовать объекты значения базы данных в последующих архитектурных слоях).
ЗА:
МИНУСЫ:
Pro: абстрактное разделение.
Против: шаблонный код (слава богу за генераторы кода / шаблоны и ORM).
Какую альтернативу вы рассматриваете?
Кажется довольно очевидным, что возложение ответственности за Устойчивость где-то еще, кроме уровня представления, обычно будет хорошей, просто из-за аргументов ясности ответственности и повторного использования. Я инстинктивно выбираю трехуровневый подход: презентация, обслуживание, настойчивость. Признаюсь, что делал это так долго, что не могу найти доказательств боли, которую я испытывал, если не делал этого. Мне кажется «очевидным», что наличие единственного уровня, который понимает механизм персистентности, должно упростить тестирование, облегчить обслуживание и дать хорошее разделение проблем.
Таким образом, остается вопрос о том, как именно сделать уровень персистентности. Мое предположение по умолчанию - использовать JPA (или аналогичные фреймворки). Я рассматриваю это как сложный пример DAO.
Итак, я вижу две стоимости DAO. Сначала вам нужно вложиться в структуру вашей программы, ее дизайн. Для тривиальных случаев это может показаться излишним. Во-вторых, если вы используете фреймворк, реализующий DAO, вам придется научиться. По сравнению с написанием кода JDBC напрямую, это еще одно вложение.
Сила шаблона DAO заключается в том, что он позволяет вам создать хороший уровень абстракции реальной системы хранения. Они обеспечивают более объектно-ориентированное представление уровня сохраняемости и четкое разделение между доменом и кодом, который фактически будет выполнять доступ к данным (прямой JDBC, структуры сохраняемости, ORM или даже JPA).
Если бы мне пришлось указать на слабость, я бы сказал, что это еще один уровень ... Но я думаю, это цена, которую нужно заплатить за то, чтобы не связывать свой код с базовым API персистентности.
PRO
CON
Как и с большинством шаблонов разработки, использование DAO требует некоторого времени, чтобы привыкнуть. С опытом появляются преимущества более надежного кода и разработчиков, которые знают, почему все работает, а не только то, что кажется. Этот последний пункт является для меня самым большим преимуществом.
Предостережение,