Почему отправка файлов из GridFS через MVC4 занимает так много времени?

Я хочу отправлять изображения, хранящиеся в MongoDB, с помощью GridFS через веб-приложение MVC4 в браузер через среду моей локальной сети, но до отправки изображения в браузер требуется ~ 500 мс.

Сетевой инспектор Google Chrome говорит, что большая часть времени тратится на «Ожидание», тогда как фактическое «Получение» занимает ~ 1 мс.

Сервер MongoDB находится в локальной сети, так почему же может так долго отправляться образ размером 10 КБ? Я использую Windows 8 с Visual Studio 2012 и официальным драйвером mongo-csharp через 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