2013-12-11 1 views
0

Является ли System.OutOfMemoryException ожидаемым, если большое количество (например, более 625 000) записей будет возвращено из вызова функции executequery()?BreezeJS: Получение большого количества записей с помощью executequery() == System.OutOfMemoryException

Использование take() работает нормально, например.

var query = breeze.EntityQuery 
    .from("Biography") 
    .select("ENTITY_ID, NAME, NICKNAME") 
    .where("VAL1","==","AL") 
    .orderBy("ENTITY_ID") 
    .take(1000); 

Однако, запрашивая все записи, возникает ошибка System.OutOfMemoryException.

var query = breeze.EntityQuery 
    .from("Biography") 
    .select("ENTITY_ID, NAME, NICKNAME") 
    .where("VAL1","==","AL") 
    .orderBy("ENTITY_ID"); 

Выполнение эквивалентного SQL занимает около 5 секунд для успешного завершения.

+0

Что вы хотите сказать? – Ward

+0

Когда будет обнаружено событие System.OutOfMemoryException, лучшее решение для объединения результатов нескольких запросов, которые используют skip() и take()? – user3071284

ответ

1

Я не удивлен.

Для того чтобы быть ясным, вы пытаетесь переместить более 625 000 записей по проводу, а затем создать объекты из них. Запрос на сервере, скорее всего, очень быстрый, но затем каждая из этих записей должна быть сериализована для json, отправлена ​​по проводу и затем воссоздана как объект. Эти операции могут быть как трудоемкими, так и памятью с большим количеством данных даже с лучшими реализациями.

Итак, у вас есть несколько вариантов уменьшения как объема памяти, так и времени, которое требуется выполнить.

  1. Используйте взять (на вашем примере)
  2. Используйте EntityQuery.noTracking вариант. Это пропускает шаг преобразования сериализованных записей в «истинные» объекты. Если вам нужны «истинные» сущности, вы можете добавить их выборочно в EntityManager по мере необходимости.
+0

Я объединил обе опции и поместил следующее в конце назначения переменной запроса: take (500000) .noTracking(); Это работает, несмотря на то, что более 500000 результатов в одном исключении из памяти. Я думаю, что я попробую несколько запросов, используя skip() и take(), каждый раз добавляя записи в массив - если нет другого пути. Любая идея, которая может быть лучше? – user3071284