Way Subsonic 3 использует память
-
14-11-2019 - |
Вопрос
Я пытаюсь сделать сравнение между дозвуковыми 3, набора данных и структурой набора данных. Причина, почему для моей стажировки я должен прояснить мой выбор.До сих пор я знаю, что наборы данных работает следующим образом с получением данных:
- db в память
- Запрос на БД в памяти
- Результат в результате запроса
Framework Entity (.NET версия 3.5) делает это следующим образом. (Используя .NET 3.5, потому что он должен работать на SharePoint 2010, и это только поддерживает .NET 3.5 из-за версии CLR)
- запрос на БД Результат
- вернулся на объекты в памяти
- Результат возвращен
До сих пор я не нашел схемы для дозвуковых 3, как они это делают. Я надеюсь, что один из вас может помочь мне
Решение
Это полностью зависит от стратегии, которую вы используете (ActiveReCord / linqtemplates / simplepositor)
- .
-
activeerecord: Каждая одиночная запись содержит свой собственный экземпляр для репо, который приведет к высоким использованию памяти для больших списков.
-
linqtemplates: Намного меньше использование памяти, у вас есть экземпляр вашей БД, который содержит схему каждой таблицы и чистые данные.
-
SimplerePository Даже меньше, поскольку экземпляр репо, ничего не знает о вашей базе данных. Это почти только использование чистых данных в памяти.
Я бы предложил использовать как шаблоны ActiveRecord и Linq. LINQ для запроса больших списков и ActiveRecord для редактирования одной записи или небольших списков (<100 записей).
Subsonic не делает кэширование по дизайну, поэтому я не буду беспокоиться об этом. Но великая вещь о материалах LINQ (для всех трех стратегий) заключается в том, что вы не попали в базу данных, пока вам не понадобится данные, поэтому вы можете контролировать, сколько памяти вы используете.
<Сильный> Пример:
.var db = new NorthwindDb(); // does not hit the database (just an expression) // since we only need ProductId and ProductName in this example, // there is no need to pull the entiry Product from the database. var query = from p in db.Products where p.CategoryId == 5 select new {p.ProductId, p.ProductName }; // executes: SELECT COUNT(*) FROM products WHERE categoryid = 5; var count = query.Count(); // does not execute anything var top10 = query.Take(10); // executes: SELECT productid, productname // FROM products WHERE categoryid = 5 LIMIT 10 // LIMIT = MySQL paging, don't know how to write that for SQLServer // p in this example is not a product, but an anonymous type with // only two properties (ProductName and ProductId) foreach (var p in top10); Console.WriteLine("ProductId {0} Name {1}", p.ProductId, p.ProductName);
<Сильное> Обновление: Я не знаю, какое приложение вы разрабатываете, но если вам нужно отображать данные в DataGrid, я бы предложил использовать DEVEXPRESS XTRAGRID (доступно для WinForms, WPF / Silverlight и ASP.NET), который имеет ServerMode, который работает довольно хорошо С дозвуковыми linqtemplates (поскольку он может быть связан с iQuerable, и сам обрабатывает пейджинг / сортировку / фильтрацию на iQuerable и требуется только несколько записей одновременно. Это значительно снижает след памяти и производительность нашего приложения нашего приложения (которая загрузила кучу записей в DataTable).