EF Code First тормозит
От: Аноним  
Дата: 19.11.11 10:18
Оценка: :)
Привет.

Начал пробовать испльзовать Entity Framework 4.2 Code First.
При добавлении объектов в контекст, каждая новая тысяча объектов добавляется за все большее время.
Притом время растет судя по всему по экспоненте.
Попробовал вызывать каждые 100 объектов SaveChanges, не помогло.
Стал пересоздавать контекст каждые 100 объектов, возникла проблема что надо следить за объектами, и самому их детачить от старого контекста и аттачить к новому, иначе начинаются какие то левые ошибки.
Может при обычной работе это и не будет иметь заначения, но я решил начать с того, что переношу немного данных из другой базы и мне хотелось сделать это в одной транзакции. Вобщем добавить 10000 объектов за приемлемое врямя практически невозможно.
Кто виноват? Что делать?
Re: EF Code First тормозит
От: Jiteco  
Дата: 20.11.11 01:11
Оценка: -1
Здравствуйте, <Аноним>, Вы писали:

А>Привет.


А>Начал пробовать испльзовать Entity Framework 4.2 Code First.

А>При добавлении объектов в контекст, каждая новая тысяча объектов добавляется за все большее время.
А>Притом время растет судя по всему по экспоненте.
А>Попробовал вызывать каждые 100 объектов SaveChanges, не помогло.
А>Стал пересоздавать контекст каждые 100 объектов, возникла проблема что надо следить за объектами, и самому их детачить от старого контекста и аттачить к новому, иначе начинаются какие то левые ошибки.
А>Может при обычной работе это и не будет иметь заначения, но я решил начать с того, что переношу немного данных из другой базы и мне хотелось сделать это в одной транзакции. Вобщем добавить 10000 объектов за приемлемое врямя практически невозможно.
А>Кто виноват? Что делать?

Да, он тормазной ))
... << RSDN@Home 1.2.0 alpha 5 rev. 1537>>
Screen Capture Software
Re: EF Code First тормозит
От: 0K Ниоткуда  
Дата: 20.11.11 02:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Начал пробовать испльзовать Entity Framework 4.2 Code First.

А>При добавлении объектов в контекст, каждая новая тысяча объектов добавляется за все большее время.

Какая база данных?
Re[2]: EF Code First тормозит
От: Аноним  
Дата: 20.11.11 07:27
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Какая база данных?


MSSql, в объекте всего лишь Id, 4 ссылки на объекты и пара скалярных полей.
Вобщем транзакцией все обернуть не проблема, но вот я чего то не очень пойму логику
разработчиков, когда я атачу объект в контекст, они смотрят все поля ссылки этого объекта и добавляют эти объекты к контексту(вместо атача) в результате эти объекты добавляются в базу по нескольку раз.
Re[3]: EF Code First тормозит
От: hardcase Пират http://nemerle.org
Дата: 20.11.11 07:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 0K, Вы писали:


0K>>Какая база данных?


А>MSSql, в объекте всего лишь Id, 4 ссылки на объекты и пара скалярных полей.


Просто уберите ссылки, оставьте лишь id-шники.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: EF Code First тормозит
От: Аноним  
Дата: 20.11.11 09:22
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Просто уберите ссылки, оставьте лишь id-шники.


Убрал все что можно.
вот код:

AppContext context = app.CreateContext()
{
  DateTime dd = DateTime.Now;
  for (int i = 0; i < 10000; i++)
  {
    Company c = new Company { Inn = i.ToString(), Name = "Company + " + i.ToString() };
    context.Set<Company>().Add(c);
    if (i % 1000 == 0)
    {
      Console.WriteLine(string.Format("{0}: {1}", i, DateTime.Now - dd));
      dd = DateTime.Now;
    }
  }
}


класс Company

public class Company
{
  public int Id { get; set; }
  public string Inn { get; set; }
  public string Name { get; set; }
}


Результат:
0: 00:00:00.0040003
1000: 00:00:00.4690268
2000: 00:00:01.3380765
3000: 00:00:02.2231272
4000: 00:00:03.2131838
5000: 00:00:04.0172297
6000: 00:00:04.9962858
7000: 00:00:05.9833422
8000: 00:00:07.1994118
9000: 00:00:08.3144756

Куда теперь копать?
Re: EF Code First тормозит
От: alexsoff Россия  
Дата: 20.11.11 13:56
Оценка: 19 (3)
Здравствуйте, Аноним, Вы писали:

А>Может при обычной работе это и не будет иметь заначения, но я решил начать с того, что переношу немного данных из другой базы и мне хотелось сделать это в одной транзакции. Вобщем добавить 10000 объектов за приемлемое врямя практически невозможно.

Может и offtop, но я при необходимости импорта единовременно более 1000 записей использую bulk insert здесь
Подружить EF с bulk можно, как описано здесь
Re[5]: EF Code First тормозит
От: 0K Ниоткуда  
Дата: 20.11.11 18:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Куда теперь копать?


Если сохранять после 1000 добавлений объектов? То есть не накапливайте слишком много.
Re[2]: EF Code First тормозит
От: DorfDepp  
Дата: 20.11.11 20:19
Оценка:
Здравствуйте, Jiteco, Вы писали:

J>Здравствуйте, <Аноним>, Вы писали:


А>>Кто виноват? Что делать?


J>Да, он тормазной ))


А я люблю ADO.NET и мои хранимые процедуры.
Re[6]: EF Code First тормозит
От: Аноним  
Дата: 21.11.11 17:18
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Если сохранять после 1000 добавлений объектов? То есть не накапливайте слишком много.


Так и пришлось делать. Только приходится следить за объектами, чтоб они 2 раза не добавились.
Например: если не аттачим объекты, то они добавляются еще раз, если аттачим, то если в них есть какие то ссылки на другие объекты, то EF добавит к контексту объекты по ссылкам, притом не аттачем, а добавлением, т.е. опять таки в базе будут лишние объекты.
Пока что нашел такое решение, дополнительно делаются поля ид ссылок на объекты и присваиваются только они. Но вобще удивительно, чего они там намудрили, это ведь еще даже не запись объектов в базу, а всего лишь добавление их в набор для записи. сам вызов SaveChange делается быстро.
Re[2]: EF Code First тормозит
От: Аноним  
Дата: 21.11.11 17:24
Оценка:
Здравствуйте, alexsoff, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>Может и offtop, но я при необходимости импорта единовременно более 1000 записей использую bulk insert [url=http://msdn.microsoft.com/ru-ru/library/ms188365.aspx

A>]здесь[/url]
A>Подружить EF с bulk можно, как описано здесь

Спасибо. Хорошее решение.
Просто хотелось таки общаться с базой полностью через объекты. Не так уж много объектов то и вставляется, притом до работы с базой дело не доходит, тормозит на этапе добавление объектов в контекст, само сохранение делается быстро.
Re[3]: EF Code First тормозит
От: Tom Россия http://www.RSDN.ru
Дата: 21.11.11 21:25
Оценка:
А>Просто хотелось таки общаться с базой полностью через объекты.
Почему? Т.е. откуда это желание общаться с БД только через обьекты?
Народная мудрось
всем все никому ничего(с).
Re[4]: EF Code First тормозит
От: bisoft Россия www.grapholite.com
Дата: 22.11.11 02:42
Оценка:
Здравствуйте, Tom, Вы писали:

А>>Просто хотелось таки общаться с базой полностью через объекты.

Tom>Почему? Т.е. откуда это желание общаться с БД только через обьекты?

Ленив я, поэтому база генерится и обновляется автоматически, и какие объекты в какую таблицу попадут мне не интересно. Хотя это наверное и не главное, главное то, что у объектов своя логика и чего они у себя проверяют перед сохранением и какие действия проделывают — базе данных неведомо, а повторять всю эту логику, чтоб точно распихать все куда нужно — наверное можно, но очень глупо.
С уважением,
Андрей Мазуров.
Re[3]: EF Code First тормозит
От: alexsoff Россия  
Дата: 22.11.11 04:00
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Просто хотелось таки общаться с базой полностью через объекты. Не так уж много объектов то и вставляется, притом до работы с базой дело не доходит, тормозит на этапе добавление объектов в контекст, само сохранение делается быстро.
К сожалению, когда дело касается перфоманса, приходится жертвовать многим, то архитектуру искривить, то извратиться так, что без пол литра не разберешь
Re[3]: EF Code First тормозит
От: HowardLovekraft  
Дата: 22.11.11 05:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>MSSql, в объекте всего лишь Id, 4 ссылки на объекты и пара скалярных полей.

Ссылки — это foreign key associations или independent associations?
Re[4]: EF Code First тормозит
От: bisoft Россия www.grapholite.com
Дата: 22.11.11 08:00
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, Аноним, Вы писали:


А>>MSSql, в объекте всего лишь Id, 4 ссылки на объекты и пара скалярных полей.

HL>Ссылки — это foreign key associations или independent associations?

FK, да это и не имеет занчения, я эе провел тест и с 2 полями, они никак не влияют на скорость.
С уважением,
Андрей Мазуров.
Re[7]: EF Code First тормозит
От: bisoft Россия www.grapholite.com
Дата: 05.12.11 15:18
Оценка:
Если кому интересно, все дело оказалось в трекере изменений, если запретить отслеживать изменения объектов, то все летает.
С уважением,
Андрей Мазуров.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.