2013-06-27 5 views
5

Wiem, że nie zaleca się używania Entity Framework do wstawiania zbiorczego, ponieważ dodaje je jeden po drugim. (Example 1, example 2.)Zapisywanie dużego wykresu w Entity Framework 5

Jak dołączyć jeden obiekt, który ma duży wykres pod nim, np. 100 tysięcy obiektów? - Konkretnie:

  • Jakie są (czas/pamięć) względy wydajności korzystania EF5 to zrobić?
  • Czy istnieją jakieś sprawdzone metody przechowywania dużych wykresów?
  • Czy relacyjne bazy danych są dobrym pomysłem na przechowywanie dużych wykresów?

Nieco tle:

  • wykres jest tworzona EF5 Poços, a następnie dołączana do korzeni i zapisane. Wykres jest zawsze nowymi danymi, nigdy nie aktualizuje się. DB używamy jest SQL Server 2012.

  • Sam proces tworzenia może trwać kilkadziesiąt sekund dla dużych przypadkach (100ks obiektów), więc jeśli dołączyć/zapisać proces zajmuje 10% tego czasu nie będzie mają znaczący wpływ na ogólną wydajność czasową.

+0

Niekonieczne jest dodawanie jednostek jeden po drugim. W mojej praktyce podzieliłem mój wykres obiektów na niezależne (prawie) części i ładuję je krok po kroku, aby zachować integralność i nie uzyskać "OutOfMemoryException" lub po prostu godzin beznadziejnego czekania. – Fedor

+0

@Fyodor Nie otrzymałem wyjątku braku pamięci i nie zajęło to wiele godzin. –

+0

Masz szczęście, a twój wykres jest bardziej przydatny niż mój. – Fedor

Odpowiedz

4

Jak nikt nie odpowiedział z jakiegoś powodu, nawet powszechnie znany tutaj ekspert EF, wtedy spróbuję zapytać.

Niedawno miałem do czynienia ze złożonym modelem z dużą ilością odniesień cyklicznych i liczbami relacji pomiędzy obiektami. I duża ilość danych, tak, tak jak twoja lub większa. Próbowałem wielu rzeczy i żadne nie było dla mnie wygodne, więc skończyłem z użyciem Fastest Way of Inserting in Entity Framework. Pomogło mi to wiele lat temu i nie wspominałeś o tym w swoim poście.


Ale jeśli nie masz wiele skomplikowanych relacji pomiędzy podmiotami i mają dużą ilość całkowicie nowych danych, aby wstawić tylko jeden raz, to najszybszy sposób, jak już mentioned mieć to SqlBulkCopy ponieważ jest niezwykle szybki i proste w tym przypadku.
Korzystając na przykład z metody CodeFirst, można najpierw utworzyć strukturę bazy danych, a następnie po prostu wstawić dane.

Mam nadzieję, że pomoże! Nie zgaduj, jeśli korzystanie z pamięci NoSQL będzie szybkie lub wygodne w Twoim przypadku, ponieważ nigdy nie korzystałem z tych rozwiązań. Być może doświadczeni koledzy dodadzą trochę informacji na ten temat.

+0

Im więcej jednostek jest dodanych w jednej operacji, tym szybciej, o ile operacja nie zajmuje zbyt wiele pamięci. Podziel według typu obiektu i wstaw cały obiekt tego typu za pomocą SqlBulkCopy jest najszybszy? –

+0

Tak, jest to najszybszy sposób robienia tego. Wstawienie wszystkich tych wpisów zajmie kilka sekund. – Fedor