小弟求助大神,mongodb在阿里云服务器上centos7.0 取图片250kb需要3s,直接访问云服务器磁盘图片只需要不到1s

小黑鸣 2018-01-11 10:48:28

mongodb版本是3.4.7

使用GridFS存取图片

代码如下


/**
* 保存文件
* @param collectionName
* @param mongoFile
*/
public boolean saveFiles(String collectionName, MongoFile mongoFile){
try{
// DB db = mongoTemplate.getDb();
// DBCollection mongdb_pic = db.getCollection(collectionName);
// DBObject dbObject = new BasicDBObject();
// if(mongoFile.getFile() != null){
// byte[] bytes = FileUtil.file2byte(mongoFile.getFile());
//
// Binary binary = new Binary(bytes);
// dbObject.put("imgByte", binary);
// }
// dbObject.put("id", mongoFile.getId());
// dbObject.put("fileName", mongoFile.getFileName());
// dbObject.put("fileSize", mongoFile.getFileSize());
// dbObject.put("descs", mongoFile.getDescs());
// dbObject.put("fileType", mongoFile.getFileType());
// dbObject.put("contentType", mongoFile.getContentType());
// dbObject.put("oldName", mongoFile.getContentType());
// mongdb_pic.save(dbObject);

DB db = mongoTemplate.getDb();
GridFS gridFS = new GridFS(db, collectionName);
GridFSInputFile gfs = gridFS.createFile(mongoFile.getFile());
System.out.println("文件大小:" + mongoFile.getFile().length());
gfs.setChunkSize(mongoFile.getFile().length());
gfs.setFilename(mongoFile.getFileName());
gfs.put("_id", mongoFile.getId());
gfs.put("fileName", mongoFile.getFileName());
gfs.put("fileSize", mongoFile.getFileSize());
gfs.put("descs", mongoFile.getDescs());
gfs.put("fileType", mongoFile.getFileType());
gfs.put("contentType", mongoFile.getContentType());
gfs.put("oldName", mongoFile.getOldFileName());
gfs.save();
}catch (Exception e){
logger.error("Mongo数据操作>>存储文件发送错误>>error:" + e.toString());
e.printStackTrace();
return false;
}
return true;
}

/**
* 查询文件
* @param collectionName
* @param filename
* @return
*/
public GridFSDBFile retrieveFileOne(String collectionName, String filename) {
try {
DB db = mongoTemplate.getDb();
GridFS gridFS = new GridFS(db, collectionName);
GridFSDBFile dbfile = gridFS.findOne(filename);
if (dbfile != null) {
return dbfile;
}
} catch (Exception e) {
logger.error("Mongo数据操作>>获取文件发送错误>>error:" + e.toString());
e.printStackTrace();
}
return null;
}


...全文
780 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
rucypli 2018-01-15
  • 打赏
  • 举报
回复
另外如果图片大小都小于16M 可以考虑用用document来存储 不用gridfs 毕竟取一个document 比取好几个gridfs的chunk要快很多
小黑鸣 2018-01-12
  • 打赏
  • 举报
回复
引用 8 楼 rucypli 的回复:
另外直接访问云磁盘这种方法是不可取的 因为没有高可用机制
我应该怎么做呢,目前我这里取图片执行慢,是因为什么原因,我目前只想到numa,但是mongodb日志没打印出这方面的信息,启动mongodb也在加了前缀 numactl --interleave=all。 直接访问云磁盘,会导致需要这么久吗
rucypli 2018-01-12
  • 打赏
  • 举报
回复
另外直接访问云磁盘这种方法是不可取的 因为没有高可用机制
小黑鸣 2018-01-12
  • 打赏
  • 举报
回复
启动mongodb我也执行了numactl --interleave=all。没生效吗这是。奇怪了。开发环境,测试环境,就生产环境有问题,
小黑鸣 2018-01-12
  • 打赏
  • 举报
回复
引用 5 楼 rucypli 的回复:
[quote=引用 3 楼 javalearnNet 的回复:] [quote=引用 1 楼 rucypli 的回复:] 用mongofiles看下取图片需要多久
取图片877kb 大概默念算了一下,有4秒钟。这是为啥啊。不明白了。[/quote] 多执行几遍试下 可能没有缓存到内存[/quote] 执行很多遍了,同样是阿里云服务器,我在自己的服务器上,内存4g的,执行同样命令也很快。在公司却很慢,这是为啥,和numa有关系吗
rucypli 2018-01-12
  • 打赏
  • 举报
回复
引用 3 楼 javalearnNet 的回复:
[quote=引用 1 楼 rucypli 的回复:] 用mongofiles看下取图片需要多久
取图片877kb 大概默念算了一下,有4秒钟。这是为啥啊。不明白了。[/quote] 多执行几遍试下 可能没有缓存到内存
rucypli 2018-01-12
  • 打赏
  • 举报
回复
引用 2 楼 javalearnNet 的回复:
[quote=引用 1 楼 rucypli 的回复:] 用mongofiles看下取图片需要多久
怎么看取图片的时间啊 ./mongofiles -d preFileDb get "1.jpg" 怎么显示执行时间呢 [/quote] time ./mongofiles -d preFileDb get "1.jpg"
rucypli 2018-01-12
  • 打赏
  • 举报
回复
监控下操作系统状态
小黑鸣 2018-01-11
  • 打赏
  • 举报
回复
引用 1 楼 rucypli 的回复:
用mongofiles看下取图片需要多久
取图片877kb 大概默念算了一下,有4秒钟。这是为啥啊。不明白了。
小黑鸣 2018-01-11
  • 打赏
  • 举报
回复
引用 1 楼 rucypli 的回复:
用mongofiles看下取图片需要多久
怎么看取图片的时间啊 ./mongofiles -d preFileDb get "1.jpg" 怎么显示执行时间呢
rucypli 2018-01-11
  • 打赏
  • 举报
回复
用mongofiles看下取图片需要多久

1,746

社区成员

发帖
与我相关
我的任务
社区描述
MongoDB相关内容讨论区
社区管理员
  • MongoDB社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧