设为首页 收藏本站
查看: 4076|回复: 0

[经验分享] mongodb python image 图像存储读取

[复制链接]

尚未签到

发表于 2015-4-28 08:33:02 | 显示全部楼层 |阅读模式
  最近做一些数据库调研的工作,目标是实现影像更快的入库、出库、查询,并实现并行访问等操作。
  将结果总结成一个mongoImg类,也算是小结吧。
  



1 '''
2 Created on 2013-8-6
3 class mongoInsert
4 @author: tree
5 '''
6 __metaclass__ = type
7
8 import os
9 from pymongo.database import Database
10 import time
11 import gridfs
12
13 class mongoImg(object):
14     """mongoInsert is a class for inserting document
15     
16     
17     """
18     def __init__(self, database, dir):
19         """Create a new instance of :class:mongoInsert
20         :Parameters:
21           - `database`: database to use
22           - `dir` : directory of document
23           """
24         if not isinstance(database, Database):
25             raise TypeError("database must be an instance of Database")
26         if len(dir) < 1:
27             raise TypeError("dir must be an string of directory")
28         
29 #         self.__con = Connection()
30         self.__imgdb = database
31         self.__imgfs = gridfs.GridFS (self.__imgdb)
32         self.__dir = dir
33         self.__filelist=[]
34
35     #save filepath in list.txt
36     def __dirwalk(self,topdown=True):
37         """traverse the documents of self.__dir and save in self.__filelist
38         """
39         sum=0
40         self.__filelist.clear()
41         
42         for root,dirs,files in os.walk(self.__dir,topdown):
43             for name in files:
44                 sum+=1
45                 temp=os.path.join(root,name)
46                 self.__filelist.append(temp)
47         print(sum)
48
49     #insert image
50     def insert(self):
51         """insert images in mongodb
52         """
53         self.__dirwalk()
54
55         tStart = time.time()        
56         for fi in self.__filelist:      
57             with open (fi,'rb') as myimage:
58                 data=myimage.read()                  
59                 self.__imgfs.put(data, content_type = "jpg", filename =fi)
60     
61         tEnd =time.time ()
62         print ("It cost %f sec" % (tEnd - tStart))
63         
64     #get image by filename
65     def getbyname(self,filename,savepath):
66         """get img from mongdb by filename
67         """
68         if len(savepath) < 1:
69             raise TypeError("dir must be an string of directory")
70         dataout=self.__imgfs.get_version(filename)
71         try:
72             imgout=open(savepath,'wb')
73             data=dataout.read()
74             imgout.write(data)
75         finally:
76             imgout.close()
77         
  使用示例:也可以将数据库连接写在类内部



1 from pymongo import Connection
2 import mongoImg
3
4 filedir=r'D:\image'
5 con = Connection()
6 db = con.imgdb
7 imgmongo=mongoImg.mongoImg(db,filedir)
8 imgmongo.insert()
  
  感觉mongodb存储影像切片还是蛮快的,1w多个图片,大约100-200秒左右。
DSC0000.png
  tip:
  gridfs.GridFS.put 函数



put(data, **kwargs)
Put data in GridFS as a new file.
Equivalent to doing:
try:
f = new_file(**kwargs)
f.write(data)
finally
f.close()
  在存储读取图像时,犯了低级错误,将open得到的file实例当做数据存储,读取的时候怎么也读不出数据。。。囧
  
另外以字节流形式读取图像数据比较适合。
  pipe = open('/dev/input/js0','rb')
  如果以str形式存储的话,可能会出现UnicodeDecodeError错误,貌似是因为图像数据有些超出了python默认编码的存储区间。
  
  ps:初学python 数据库操作也忘得差不多 欢迎大家批评和指正~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61386-1-1.html 上篇帖子: Python显示函数调用堆栈 下篇帖子: Python中使用lambda函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表