2016-07-25 30 views
0

SQLサーバーにイメージをbytes[]に格納し、次にVIEWDATAを使用してデータベースに格納します(bytes[])これは私が)取得しています:ASP.NET MVC 5のSQL Serverから極端に遅い検索イメージ(バイト[]で格納)

アクションコントローラ:

public ActionResult show_pics2() 
{ 
    using (cygnussolutionEntities6 db = new cygnussolutionEntities6()) 
    { 
     // db.CommandTimeout = int.MaxValue; //For test 
     var querylist = (from f in db.Images 
         select f.ImageContent); 

     // get list in ViewBag 
     ViewBag.DataLIst = querylist; 

     // get list in View Data 
     ViewData["images"] = querylist.ToList(); 

     return View(); 
    } 
} 

を考慮して、私は、画像を解析し、foreachループとviewDATAでそれを表示するが、ブラウザにロードするためにそう長く取っています。なぜこれが長くかかるのか誰も知っていますか?

+0

ViewBagとViewDataに同じオブジェクト 'querrylist 'を保存しているのはなぜですか? – mmushtaq

+0

それは何も私はちょうどviewBagをコメントしました –

+0

'db.Images'にはいくつの画像があり、どれくらいの大きさですか? – Enigmativity

答えて

0

遅れが発生している場所を確認するために、いくつかのタイマーをコードに挿入する価値があります。つまり、遅いデータベースへのクエリ、結果をリストにマテリアライズしたり、画像を処理するときに表示されます。

また、読み込み中の追加のナビゲーションプロパティの数に応じて、パフォーマンスに影響するように、Imagesテーブルからすべてのプロパティを読み込んでいますか?

ビューとエンティティクラス内にコードを投稿できますか?

0
  1. あなたはToList()何かに行くとも(あなたが本当に照会可能なインタフェースを維持する必要がない場合)の両方の用途がToList()の結果を使用して行い、その後、他の場所でそれを使用しようとしている場合。その後、そのリストを1回だけ取得する必要があります。

  2. 複数のブロブを取得して1つのページで使用したり、複数のIDを取得したり、それらを使用して<img src="theImage/@id">などの他のリソースを呼び出してから、そのリソースを単独のイメージのみを取得するビューで提供します。このような各リソースは、単一のイメージをロードし、互いに並行して実行できます。

  3. イメージがすべて小さい場合を除き、ADOで構築されたストリームをBLOBにアクセスし、EFではなく一度に4096バイトのチャンクをストリームアウトします。それは、EFがあなたに与えるものをたくさん残すことを意味します(そして、MVCがあなたに与えたことの多くは、ビューではなく結果で行う必要があるためです)。メモリ効率のよいストリーミングが可能になります。チャンク。

+0

ありがとう私はそれに取り組んでいます:) –

関連する問題