【问题标题】:Why does sending files from GridFS via MVC4 take so much time?为什么通过 MVC4 从 GridFS 发送文件需要这么多时间?
【发布时间】:2013-02-12 22:00:04
【问题描述】:

我想通过 MVC4 Web 应用程序使用 GridFS 将存储在 MongoDB 中的图像通过我的 LAN 环境发送到浏览器,但是图像发送到浏览器需要大约 500 毫秒。

Google Chrome 网络检查员说大部分时间都花在“等待”期间,而实际的“接收”大约需要 1 毫秒。

MongoDB 服务器在本地网络中,那么发送一个 10kb 的图像需要这么长时间?我使用 Windows 8 和 Visual Studio 2012,并通过 NuGet 使用官方 mongo-csharp-driver。

这是我的“文件”控制器的代码,它采用对象 ID 并发送此 ID 的数据:

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) })"/>

【问题讨论】:

  • 您的收藏中有多少条记录?另外,您是否尝试过在 shell 上运行 explain ?也许您缺少索引或其他内容。
  • 目前只有~10条记录供测试
  • 在查询中运行explain 怎么样?或者检查你的 web 服务器和你的 mongodb 服务器之间的延迟?
  • 这是在gridFs.Find(Query.EQ("_id", bsonId)) 结果上调用Explain() 时的输出:pastebin.com/bXeMX3hv

标签: mongodb asp.net-mvc-4 mongodb-.net-driver iis-8 gridfs


【解决方案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));

我不确定实例化这些会产生多少开销,但将其移到您尝试优化的方法之外并没有什么坏处。

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多