Оптимизация поиска изображений с помощью LINQ - PullRequest
2 голосов
/ 27 июля 2010

Я работаю над оптимизацией извлечения изображений из базы данных с помощью LINQ.

Приблизительный размер изображения составляет 4000 * 1000 пикселей, который весит около 400-600 КБ.

Изображения извлекаются через контроллер, который вызывается веб-службой. Веб-сервис вызывается через jQuery.

Первое изображение, которое извлекается примерно через 0,7 - 1,5 секунды, когда последующие изображения занимают от 3 до 4 секунд.

Код, считывающий изображения из базы данных, не заключен в using { }, я изо всех сил пытаюсь понять, как использовать это предложение с методами, которые просто возвращают байтовый массив.

Есть ли способы улучшить производительность здесь?

Спасибо

Редактировать: Я собираюсь запустить профилирование и опубликовать код, как только получу результаты обратно. Спасибо

Ответы [ 2 ]

3 голосов
/ 27 июля 2010

Очень сложно что-либо сказать без реального исходного кода.Что еще хуже, так же трудно сказать что-нибудь разумное с указанным кодом: программисты очень плохо умеют эмпирически находить узкие места.Вам нужен приличный профилировщик производительности на стороне сервера (например, dotTrace ) и HTTP-анализатор на стороне клиента (например, Fiddler ).

С серверной стороны вы увидите, какие строки кода занимают больше времени для выполнения, а затем попытаетесь улучшить на основе этих знаний.Возможно, вы извлекаете слишком много данных из БД или отсутствуют правильные индексы.

Анализатор на стороне клиента покажет вам, какие HTTP-заголовки отправляются с вашим ответом (помните, что кэширование в HTTP является королем)и вообще, как долго ваши запросы выполняются.

1 голос
/ 27 июля 2010

Насколько я понимаю ваш вопрос, изображение извлекается через веб-службу, что означает, что изображение извлекается, помещается в бинэксид в сообщении SOAP, отправляется по проводам, в незафиксированном виде на стороне клиента (где находится ваш запрос LINQ) , Это всегда будет очень медленно. Фактические отправленные данные в 1,5-2,0 раза больше, чем фактическое BLOB-изображение.

Получение огромных больших двоичных объектов из базы данных таким образом всегда является кошмаром производительности. Если вам нужно запросить их (вы используете LINQ), рассмотрите возможность запроса только метаданных. Получив нужный идентификатор изображения, вы извлекаете все изображение целиком.

Тем не менее, он не станет идеальным быстро. Чтобы обеспечить лучшую производительность, каждое полученное изображение должно быть кэшировано на вашем сервере (после получения веб-службой) и не должно быть получено более одного раза. Этот тип кэширования должен быть тривиально реализован. В качестве альтернативы, вы не должны хранить изображения в виде больших двоичных объектов, но сейчас, вероятно, уже слишком поздно на этапе проектирования.

Примечание к using: просто используйте его для любой переменной, которая реализует IDisposable. Однако не сказано, что это приводит к снижению производительности.

...