เหตุใดการส่งไฟล์จาก GridFS ผ่าน MVC4 จึงใช้เวลานานมาก

ฉันต้องการส่งภาพที่เก็บไว้ใน MongoDB โดยใช้ GridFS ผ่านแอป MVC4 Web ไปยังเบราว์เซอร์ผ่านสภาพแวดล้อม LAN ของฉัน แต่ใช้เวลาประมาณ ~ 500ms ก่อนที่รูปภาพจะถูกส่งไปยังเบราว์เซอร์

ผู้ตรวจสอบเครือข่าย Google Chrome บอกว่าเวลาส่วนใหญ่ถูกใช้ไประหว่าง "รอ" ในขณะที่ "การรับ" จริงใช้เวลาประมาณ ~1 มิลลิวินาที

เซิร์ฟเวอร์ MongoDB อยู่ในเครือข่ายท้องถิ่น ดังนั้นการส่งอิมเมจขนาด 10kb จะใช้เวลานานขนาดไหน ฉันใช้ Windows 8 กับ Visual Studio 2012 และไดรเวอร์ mongo-csharp-driver อย่างเป็นทางการผ่าน NuGet

นี่คือรหัสของฉันของคอนโทรลเลอร์ "ไฟล์" ของฉันซึ่งรับรหัสวัตถุและส่งข้อมูลสำหรับรหัสนี้:

public FileContentResult Files(string id)
{
    var database = new MongoClient(MyConnection).GetServer().GetDatabase("MyDB");
    var gridFs = new MongoGridFS(database);
    var bsonId = new BsonObjectId(id);
    var gridInfo = gridFs.FindOneById(bsonId);
    var bytes = GridInfoToArray(gridInfo);
    return new FileContentResult(bytes, "image/jpeg") { FileDownloadName = gridInfo.Name };
}

private byte[] GridInfoToArray(MongoGridFSFileInfo file)
{
    using (var stream = file.OpenRead())
    {
        var bytes = new byte[stream.Length];
        stream.Read(bytes, 0, (int)stream.Length);
        return bytes;
    }
}

รหัสเพื่อแสดงภาพในมุมมอง:

<img src="@Url.Action("Files", new { id = objectIdOfMyImage) })"/>

person NKnusperer    schedule 12.02.2013    source แหล่งที่มา
comment
คอลเลกชันของคุณมีกี่บันทึก? คุณได้ลองใช้ explain จากเชลล์แล้วหรือยัง? บางทีคุณอาจพลาดดัชนีหรืออะไรบางอย่าง   -  person Shane Andrade    schedule 13.02.2013
comment
ขณะนี้มีเพียง ~10 บันทึกสำหรับการทดสอบ   -  person NKnusperer    schedule 13.02.2013
comment
แล้วการเรียกใช้ explain กับข้อความค้นหาของคุณล่ะ หรือตรวจสอบเวลาแฝงระหว่างเว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์ mongodb ของคุณ?   -  person Shane Andrade    schedule 13.02.2013
comment
นี่คือผลลัพธ์เมื่อเรียก Explain() ในผลลัพธ์ gridFs.Find(Query.EQ("_id", bsonId)): pastebin.com/bXeMX3hv   -  person NKnusperer    schedule 13.02.2013


คำตอบ (1)


ผลลัพธ์จะแตกต่างกันอย่างไรหากคุณแคชฐานข้อมูลและอินสแตนซ์ MongoGridFS ของคุณ

// create static fields for _database & _gridFs
var database = _database ?? 
    (_database = new MongoClient(MyConnection).GetServer().GetDatabase("MyDB"));
var gridFs = _gridFs ?? 
    (_gridFs = new MongoGridFS(database));

ฉันไม่แน่ใจว่าคุณต้องมีค่าใช้จ่ายเท่าไรเมื่อคุณสร้างอินสแตนซ์เหล่านี้ แต่การย้ายมันออกไปนอกวิธีที่คุณพยายามปรับให้เหมาะสมก็ไม่เสียหาย

person Paul Smith    schedule 23.10.2013