Mengapa mengirim file dari GridFS melalui MVC4 memakan banyak waktu?

Saya ingin mengirim gambar yang disimpan di MongoDB menggunakan GridFS melalui aplikasi Web MVC4 ke browser melalui lingkungan LAN saya, tetapi perlu waktu ~500 md hingga gambar dikirim ke browser.

Pemeriksa jaringan Google Chrome mengatakan sebagian besar waktu dihabiskan selama "Menunggu" sedangkan "Menerima" yang sebenarnya membutuhkan waktu ~1 md.

Server MongoDB ada di jaringan lokal, jadi apa yang memakan waktu lama untuk mengirim gambar 10kb? Saya menggunakan Windows 8 dengan Visual Studio 2012 dan driver mongo-csharp resmi melalui NuGet.

Ini kode pengontrol "File" saya yang mengambil id objek dan mengirimkan data untuk id ini:

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;
    }
}

Kode untuk menampilkan gambar dalam Tampilan:

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

person NKnusperer    schedule 12.02.2013    source sumber
comment
Berapa banyak rekaman yang ada dalam koleksi Anda? Juga, sudahkah Anda mencoba menjalankan explain dari shell? Mungkin Anda melewatkan indeks atau semacamnya.   -  person Shane Andrade    schedule 13.02.2013
comment
Saat ini hanya ada ~10 catatan untuk pengujian   -  person NKnusperer    schedule 13.02.2013
comment
Bagaimana dengan menjalankan explain pada kueri Anda? Atau memeriksa latensi antara server web Anda dan server mongodb Anda?   -  person Shane Andrade    schedule 13.02.2013
comment
Berikut output saat memanggil Explain() pada hasil gridFs.Find(Query.EQ("_id", bsonId)): pastebin.com/bXeMX3hv   -  person NKnusperer    schedule 13.02.2013


Jawaban (1)


Seberapa berbedakah hasilnya jika Anda melakukan cache pada instance Database dan MongoGridFS?

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

Saya tidak yakin berapa banyak overhead yang dikeluarkan saat Anda membuat instance ini, namun tidak ada salahnya untuk memindahkannya ke luar metode yang Anda coba optimalkan.

person Paul Smith    schedule 23.10.2013