Мне интересно, знает ли кто-нибудь из вас, почему моя работа ужасна;
Чего я пытаюсь достичь; Создайте 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 является узким местом здесь. ..Кэширует ли он что-то внутри, что накладывает некоторые блокировки, когда несколько процессов получают данные?
Просветите меня: -)