Subonic 3はメモリを使用しています
-
14-11-2019 - |
質問
Subonic 3、データセット、エンティティフレームワークの比較をしようとします。なぜ私のインターンシップのために私の選択を明確にしなければならないのは理由です。これまで私はデータを取得して次のように機能することをまだ知っています:
- dbメモリ
- memory のDBでクエリ
- queryからの結果
Entity Framework(.NETバージョン3.5)次のようにします。 (SharePoint 2010で作業する必要があるため、.NET 3.5を使用して、CLRバージョンのために.NET 3.5のみをサポートしているため.NET 3.5を使用します)
- db のクエリ
- 結果はメモリ内のオブジェクトに返されました
- 結果が返されました
今までサブニック3のためのスキームを見つけていません。 私はあなたの一人が私を助けることができることを願っています
解決
あなたが使用している戦略(ActiveRecord / linqtemplates / SimplePository)に完全に依存します
-
activecord: すべての1レコードはそれがリポジトリにそれ自身のインスタンスを保持します。これにより、大きなリストのためのメモリ使用量が高い。
-
linqtemplates: メモリ使用量がはるかに少ない場合は、すべてのテーブルと純粋なデータの方式を保持するDBのインスタンスがあります。
-
SimplePository. レポインスタンスはデータベースについて何もわからないため、さらに少なくなります。それはほとんどメモリ内の純粋なデータの使用だけです。
私は、ActiveCordとLINQテンプレートの両方を使用することをお勧めします。大規模なリストを照会するためのLINQ、および単一のレコードまたは小さいリストを編集するためのActiveRecord(<100エントリ)。
サブソニーはデザインでキャッシングしないので、私はそれについて心配しないでしょう。 しかし、LINQのものについての素晴らしいこと(3つの戦略のすべてのための)は、データが必要なまでデータベースを押さないので、どれだけのメモリを使用するかを制御できます。
例:
.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にデータを表示する必要がある場合は、ServerModeを持つServerModeがあるDevexpress XtraGrid(winforms、wpf / silverlight、およびasp.net)を使用することをお勧めします。サブソックスのLINQTemplatesを使用すると(IQuerableにバインドすることができ、それ自体がiQuerableでページング/ソート/フィルタリングを処理し、一度に数レコードのみを必要とします。 それはメモリフットプリントと私たちのアプリのパフォーマンスを大幅に削減しました(これは、束のレコードをデータテーブルにロードしました)。