2012-03-23 2 views
0

Мы создаем отчеты в нашем веб-приложении, запрашивая наш SQL-сервер для данных, возвращаемых как xml, а затем обрабатываем с помощью xslt для создания окончательного вывода. Как способ ускорить работу системы, мы удалили всю статическую информацию из возвращаемого sql xml и кэшировали большой XDocument со всей статической информацией в нем. Перед выполнением преобразования xsl мы добавляем XDocument со статической информацией в конец xml, который поступает из SQL-сервера. Статический XDocument составляет около 50 мегабайт и занимает много секунд для сборки с сервера sql.Кэширование больших объектов для веб-сайта asp.net

Наша проблема заключается в том, что после того, как мы начали кэшировать некоторые из этих больших XDoc, мы нажимаем ограничение на размер кеш-байтов и кеш был очищен. Восстановление этих XDocuments слишком много времени, чтобы делать, пока люди запускают отчеты. Я не пробовал сохранять эти XDocs в физический файл, потому что они необходимы для каждого запуска отчета, который происходит постоянно в течение дня.

Я думал об установке AppFabric Cache, но я не уверен, что отличная идея хранить от 5 до 10 таких больших предметов в нем.

Любые идеи? Если я установлю больше памяти на веб-сервере, будет ли она автоматически доступна для asp.net для большего кеша? Я попытался сжать данные перед сохранением их в кеше (сократился в 5 раз), но разжатие и повторная обработка XDocument замедляли работу сервера.

+0

Почему бы не использовать простой пользовательский кэш в базе данных/или сохранить их в виде файлов на диске (лучше) и предоставить эти файлы для загрузки у пользователей с помощью обработчика. – Aristos

+0

@Aristos Пользователь не загружает статические данные, он сочетается с xml, который исходит от SQL-сервера, а затем обрабатывается через xslt для создания вывода отчета. Я могу сохранить данные на диске, но затем мне нужно загрузить его через XDocument.Load() для каждого отчета. Думал, что должен быть более быстрый способ. – Wavel

+1

сохраните на диск сериализованную версию конечного XDocument.Load(), используя настоящий быстрый класс сериализации, например http://code.google.com/p/protobuf-net/ – Aristos

ответ

0

Final, просто сохраните его в файле, как есть, а затем перезагрузите его, поскольку он есть, потому что все его готово Serialized.

Protobuf-net супер быстрый и легкий, и я тестировал его и использовал, но он не делает ничего хорошего, потому что все его готовые сериализованные.

+0

Только что услышал от Марка Гравелла, который утверждает, что protobuf-net не является хорошим решением для сериализации XML, поскольку он просто сохранит его как строку. В принципе, не лучше XDocument.Save(). – Wavel

+0

@Wavel о, у вас есть право, все готовые XML, я не думал .... хммм Я меняю ответ. – Aristos

0

Вы можете сериализовать объект xml в двоичном формате и сохранить его в базе данных с помощью varbinary(max). Не уверен в производительности, но, возможно, стоит попробовать, так как это не займет много времени, чтобы реализовать его.

Что-то еще, что вы, возможно, захотите решить, - это штраф за исполнение для первого пользователя, обращающегося к отчету. Чтобы этого избежать, вы можете предварительно генерировать отчеты, чтобы они кэшировались для всех.

+0

Если я сериализую xml на сервере sql, то я возвращаюсь к квадрату, где возвращенный xml имеет как данные пользователя, так и статические данные в одном большом xml. Я не могу предварительно генерировать отчеты, поскольку они представляют собой специальные отчеты, разработанные пользователем. Пользовательские данные также постоянно меняются. – Wavel

+0

Я ошибся, я думал, что отчет ограничен, и все были одинаковы, и поэтому вы хотели использовать кеширование. –

Смежные вопросы