Я запутался с проблемой использования памяти IEnumerable, особенно сравнивайте источник данных IEnumerable из БД и источник данных IEnumerable из кода yield return
значения const.
У меня есть функция Memory
для проверки памятииспользование.
static string Memory()
{
return (Process.GetCurrentProcess().WorkingSet64 / (1024 *
1024)).ToString();
}
- Так что здесь я использую EF CORE 3.0, получая доступ к таблице 150000 записей
using DataContext context = new DataContext();
Console.WriteLine(Memory()); //21
IEnumerable<User> users = context.Users;
foreach (var i in users) {}
Console.WriteLine(Memory());//101
Console.WriteLine(GC.GetTotalMemory(true));//46620032
, по некоторым причинам я не могу загрузить фото, поэтому мне нужно напечатать результаты извините за это. (результаты в коде в виде комментариев).
И в следующем примере используется
yield return
для генерации данных IEnumerable.
static IEnumerable<User> Generator(int max)
{
for (int i = 0; i < max; i++)
{
yield return new User { Id = 1, Name = "test" };
}
}
вот результат
Console.WriteLine(Memory());// 21
IEnumerable<User> users = Generator(150000);
foreach (var i in users){}
Console.WriteLine(Memory());// 24
Console.WriteLine(GC.GetTotalMemory(true)); // 658040
Теперь я очень запуталсяна примере 1 и 2. Насколько я понимаю, для источника данных IEnumerable он будет читать по одному, а не всю коллекцию, поэтому он может уменьшить использование памяти, как в примере 2. Однако, когда речь идет об использованииEF CORE (я знаю, что это не относится к EF CORE, но мне нужен конкретный пример для этого.), Я думаю, что он все еще тянет один за другим, но мой вопрос - почему он использует гораздо больше памяти, чем второй пример. Так это тянет каждую запись одну за другой? И в конце у меня все записи из БД в памяти это правильно? Но почему второй использовать так меньше памяти? Я даю те же записи. Если кто-то может объяснить это очень ценится. Спасибо !!!