Мы изучаем использование Breeze для полевого развертывания некоторых инструментов. Сценарий таков: аудитор посетит сайты в этой области, где большую часть времени не будет - или очень деградирован - доступ в Интернет. Вместо того, чтобы копировать нашу базу данных SQL на всех ноутбуках и планшетах (если это вообще возможно), мы надеемся использовать Breeze для кэширования данных, а затем сохранить их локально, чтобы они были доступны, когда нет доступного соединения.Ограничения кеша Breeze.js? Или браузер?
К сожалению, Breeze, кажется, задыхается при кешировании значительного количества данных. Как правило, в Chrome это где-то между 8 и 13 МБ объектов (как измеряется заголовками HTTPResponse). Это может немного измениться в зависимости от того, сколько вкладок у меня открыто и что такое, но я не смог переместить это более 10%. ошибка, которую я получаю, это вкладка Chrome, и говорит мне перезагрузить. Ошибка реплицируется (я загружаю данные в 100 тыс. Кусков, и она терпит неудачу при одном и том же чтении каждый раз и отлично работает, если я остановлю ее после предыдущего чтения). Когда я изменяю размер страницы, она всегда терпит неудачу в том же диапазоне.
Является ли это ограничением Бриз, или Chrome? Или окна? Я попробовал его в Firefox, и он обрабатывает еще меньше данных, прежде чем весь браузер выйдет из строя. IE намного лучше, но никто из них не делает ничего хорошего.
Глядя на производительность в диспетчере задач, я получаю следующее:
- IE идет от 250M использования памяти в 1.7g использования памяти во время процесса кэширования и кэширует в общей сложности около 14MB, прежде чем бросать OUT- ошибка памяти.
- Хром идет от использования памяти 206B до 850 М при кэшировании в общей сложности около 9 МБ
- Firefox работает от 400 М до 750 МБ, и ему удается кэшировать около 5 МБ до того, как вся программа выйдет из строя.
Я могу рассчитать, сколько будет загружено с любыми критериями выбора, но я не могу найти способ рассчитать, сколько данных может обрабатывать какой-либо конкретный экземпляр браузера. Это делает использование Breeze для автономного аудита близким к бесполезному.
Неужели кто-нибудь еще решил эту проблему? Каковы наилучшие подходы к решению чего-то подобного. Я думал о нескольких вещах, но никто из них не идеален. Любые идеи были бы хорошы.
ДОБАВЛЕНО По просьбе Стива Шмитта:
Вот некоторые полезные ссылки:
- Metadata
- Entity Diagram (pdf) (и html и edmx)
Первый запрос, просто населяют теги на странице выполняются быстро и загружают минимальные данные:
var query = breeze.EntityQuery
.from("Countries")
.orderBy("Name")
.expand("Regions.Districts.Seasons, Regions.Districts.Sites");
После того, как пользователь выбрать сайты он/она хочет кэшировать следующие два запроса стартовало (используется как один запрос, но я разбил его на две части, надеясь, что будет меньше нагрузки на ресурсов - это не помогло). Первый запрос (обычно 2-3K-сущности и около 2 МБ) выполняется, как ожидалось. Некоторая комбинация перечисленных предикатов используется для фильтрации данных.
var qry = breeze.EntityQuery
.from("SeasonClients")
.expand("Client,Group.Site,Season,VSeasonClientCredit")
.orderBy("DistrictId,SeasonId,GroupId,ClientId")
var p = breeze.Predicate("District.Region.CountryId", "==", CountryId);
var p1 = breeze.Predicate("SeasonId", "==", SeasonId);
var p2 = breeze.Predicate("DistrictId", "==", DistrictId);
var p3 = breeze.Predicate("Group.Site.SiteId", "in", SiteIds);
После выполнения первого запроса, второй запрос (ниже) работает (также с использованием некоторой комбинации из перечисленных предикатов для фильтрации данных. Приблизительно 9 МБ, она будет иметь около 50K строк для загрузки). Когда общая загрузка загрузки между двумя запросами составляет от 10 МБ до 13 МБ, браузеры будут разбиваться.
var qry = breeze.EntityQuery
.from("Repayments")
.orderBy('SeasonId,ClientId,RepaymentDate');
var p1 = breeze.Predicate("District.Region.CountryId", "==", CountryId);
var p2 = breeze.Predicate("SeasonId", "==", SeasonId);
var p3 = breeze.Predicate("DistrictId", "==", DistrictId);
var p4 = breeze.Predicate("SiteId", "in", SiteIds);
Спасибо за интерес, Стив. Вы должны знать, что отношения сущностей унаследованы и в настоящее время находятся на производстве, поддерживая большинство операций организации, так что было бы лучше всего сделать несколько изменений. Кроме того, есть надежда на то, что это можно сделать из приложения для отчетов в тот, с помощью которого запись данных может быть выполнена в поле (так что, насколько я понимаю, использование прогнозов для ограничения данных не будет работать).
Спасибо за интерес, и дайте мне знать, если вам что-то еще нужно.
Не могли бы вы предоставить дополнительную информацию о своих данных? Может быть, предоставить метаданные для объектов, которые вы кешируете? Это может помочь определить, есть ли ошибка где-то, что вызывает проблему. –
Стив, спасибо за интерес. Обновлен вопрос, чтобы дать немного больше информации. – Beartums
В ваших тестах, что вы делаете с результатами запроса? Отбросить их? Хранение их? Очистка кеша с помощью 'manager.clear()' между запросами? Попытка понять, какая фаза вызывает проблемы. Я считаю, что у каждого браузера есть своя точка задувания для размера полезной нагрузки, но я сомневаюсь, что это так. Я склоняюсь к «слишком большому количеству объектов в памяти», и в этом случае нам нужно переосмыслить ваш подход. – Ward