Параллельно с Entity Framework. Производительность впечатляет по сравнению с запуском нескольких исполняемых файлов, почему?

Мне интересно, знает ли кто-нибудь из вас, почему моя работа ужасна;

Чего я пытаюсь достичь; Создайте 2,2 миллиона файлов. Для создания каждого файла в среднем требуется 2-5 обращений к базе данных.

Сервер, над которым я работаю, имеет 24 ядра и 190 ГБ оперативной памяти.

Я разделил файлы, которые мне нужно сгенерировать, на 24 пакета.

Когда я использую следующий код, у меня плохая производительность. Процесс генерации занимает более часа.

Parrallel.ForEach(batches, batch => 
{
    using (var ctx = new MyContext())
    {
        for each(var file in batch.Files)
        {
            GenerateFile(file);
        }
    }
});

Однако, когда я убеждаюсь, что моя программа получает параметр, чтобы программа знала, какой пакет генерировать, мне не нужно использовать параллельные функции. Если я выполняю программу для каждого пакета со следующим файлом .bat:

START CaMaakEiBericht.exe \B1
START CaMaakEiBericht.exe \B2
...
START CaMaakEiBericht.exe \B24

Она работает потрясающе быстро! Общий процесс генерации занимает менее 15 минут! Этот командный файл также гарантирует, что каждое ядро ​​использует процессор около 90%. Когда я использую параллельный подход, я использую только 30-40%.

Есть ли у кого-нибудь этому логическое объяснение? Я был доволен этим проектом, потому что наконец-то у меня появилась возможность использовать параллельную библиотеку .NET 4 в сочетании с EF, но, к сожалению, это меня немного разочаровало: -)

Лично у меня есть небольшое подозрение, что EF является узким местом здесь. ..Кэширует ли он что-то внутри, что накладывает некоторые блокировки, когда несколько процессов получают данные?

Просветите меня: -)

9
задан skaffman 10 February 2012 в 19:13
поделиться