• mongodb python image 图像存储读取


    最近做一些数据库调研的工作,目标是实现影像更快的入库、出库、查询,并实现并行访问等操作。

    将结果总结成一个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秒左右。

    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 数据库操作也忘得差不多 欢迎大家批评和指正~

  • 相关阅读:
    java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @Context
    hutool.poi使用,hutool导入
    Switch Off Offline Mode
    大数据-linux之大数据-shell变量
    大数据-linux之大数据-shell编程
    大数据-linux之java环境搭建-mysql的安装
    大数据-linux之java环境搭建-eclipse的下载安装
    大数据-linux之javaee环境搭建-tomcat的安装
    大数据-linux搭建javaee的开发环境-jdk的安装
    大数据-linux实操篇-RPM包管理
  • 原文地址:https://www.cnblogs.com/bigbigtree/p/3242483.html
Copyright © 2020-2023  润新知