Сначала я использую код EF6, чтобы выполнить запрос, который вытягивает большой объем данных для обработки с параллельным графическим процессором. Запрос linq возвращает IEnumerable.Как ускорить IEnumerable <T> доступ к базе данных
IEnumerable<DatabaseObject> results = (from items in _myContext.DbSet
select items).Include("Table1").Include("Table2");
Теперь мне нужно выполнить статистический анализ полного набора данных и представить результат пользователю.
К сожалению, из-за огромного размера возвращаемых данных просто выполняется results.ToList()
занимает очень много времени, чтобы завершить ... и я даже не начал распараллеливать обработку данных!
У меня есть что-нибудь, что я могу сделать, чтобы сделать это более эффективным, чем сокращение объема данных, которые вытаскивают? Это не вариант, поскольку это полный набор данных, которые необходимо обработать.
EDIT 1
Мой текущий код первого заключается в следующем:
public class Orders
{
[Key]
public virtual DateTime ServerTimeId
{
get;
set;
}
public string Seller
{
get;
set;
}
public decimal Price
{
get;
set;
}
public decimal Volume
{
get;
set;
}
public List<Table1> Tables1{ get; set; }
public List<Table2> Table22{ get; set; }
}
Хотя не используя .INCLUDE мой запрос ускоряет значительно, если я не использую .INCLUDE ("Tables1) .INCLUDE ("Tables2") эти поля null
в конечном итоге для этого запроса:
var result = (from items in _context.DbOrders
select orderbook).Include("Tables1").Include("Tables2")
В моей DbContext я определил:
public DbSet<Orderok> DbOrders { get; set; }
Если есть способ заставить Ef6 для заполнения этих таблиц без использования .INCLUDE, то я был бы очень рад, если бы кто-то мог поручить мне.
Можете ли вы работать партиями? Как взять первые 100, начать обработку, пропустить 100 принять 100, добавить эти данные в обработку, пропустить 200 принять 100 и так далее? – Andrei
Это может сработать. Что было бы лучше, если бы я смог преобразовать блоки дискретных партий данных в непрерывный поток; скажем, IObservable, холодный поток и трубу к процессору обработки в реальном времени. возможно ли это? Как это будет реализовано? Затем я мог обработать поток через окно с регулируемым размером данных. –
guerillacodester
Основная идея, которая приходит в голову, состоит в том, чтобы обернуть ваш запрос в какой-то итератор, что-то, что реализует IEnumerable, и для каждого следующего вызова он дает вам еще одну партию данных – Andrei