Ubuntu磁盘缓存模块提供 缩略图服务
Ubuntu磁盘缓存模块
总结
下载器提供download_album和download_artist两个异步函数,通过Qt的QNetworkAccessManager组件从dash.ubuntu.com下载图片。
为了尽可能的利用硬件资源,缩略图服务在针对长时间操作的异步接口使用了多线程的方式,提高系统IO利用率。
图片缩放和转换模块主要负责将图片转换和缩放成JPEG格式的最终图片文件。该模块使用Gdk-Pixbuf库进行转换。
缩略图服务目前使用在Ubuntu Touch系统上,为图库、相机、音乐和其他使用媒体缩略图的应用提供缩略图服务。
DBus API:缩略图服务通过DBus注册了两个接口,分别为com.canonical.ThumbnailerAdmin和com.canonical.Thumbnailer。前者提供了对缓存的操作和缓存状态查询,后者提供了GetAlbumArt、GetArtistArt和GetThumbnail三个函数,对应Qt API中的三个函数,获取不同类型的缩略图。
图片提取器使用图片转换模块从本地图片中提取缩略图图片。
最近,James Henstridge、Xavi Garcia Mena和Michi Henning为Ubuntu和Ubuntu Touch实现了一个快速、可伸缩的缩略图服务。
缩略图服务对外提供了三种API。
- QML API:通过注册为QQuickAsyncImageProvider的提供者,使得调用者能够通过传入特定的URI和参数,获取特定大小的本地或者远程缩略图文件
-
外部API
图片提取模块包括图中的音频、视频提取器,下载器和图片提取器。
针对JPEG图片,图片缩放模块会通过libexif库试图读取图片的EXIF信息。如果图片的EXIF信息包含缩略图,且该缩略图的大小不小于目标缩略图大小,则图片缩放模块会使用EXIF中的缩略图进行缩放,以提高性能。
其中getThumbnail函数从本地媒体文件提取缩略图,getAlbumArt和getArtistArt函数从远程图片服务器获取。这几个函数返回的Request对象,提供downloadFinished信号,调用者可以连接该信号异步获取缩略图数据。
-
手机和桌面应用都有很多场景需要使用缩略图服务。同时,有许多媒体类型需要生成缩略图,比如图片、音乐、视频等。为每种媒体类型设计独立的API会增加开发成本,且生成这些缩略图也需要消耗大量CPU资源,网络传输缩略图会消耗不少带宽。本文主要介绍一种通用的缩略图服务,它为开发者屏蔽了上述这些复杂内容,通过缓存等措施大大提升了缩略图服务的性能。
图片提取模块
缓存写入时间为大约2.8秒,然后测试场景为80%的缓存命中率,当缓存未命中时,在缓存中插入新的数据,触发缓存按照最近最少使用模式进行数据替换。在10万次循环中,缓存每秒返回约4800个“快照”,聚合读写吞吐率在每秒93MB。如果将缓存命中率提升到90%,每秒返回的记录数接近翻倍,达到了每秒7100条记录。[1]
对于缓存的测试,使用配置为Intel Ivy Bridge i7-3770k 3.5 GHz处理器和256GB固态硬盘的机器,测试数据为使用60字节长度字符串作为键,使用平均大小为20KB的随机二进制数据作为值,缓存大小为100MB。
简介
性能提升
由于使用了三个缓存,缩略图服务在返回指定大小缩略图时的查找流程大致为:
- 检查缩略图缓存中是否已经存在指定大小的图片。如果存在则直接返回。
- 检查全尺寸缓存中是否有该图片的全尺寸副本。如果存在则使用全尺寸图片进行缩放,将缩放完成的缩略图添加到缩略图缓存后返回。
- 检查失败缓存中是否有对应的项,如果有则直接返回错误。
- 尝试从远程下载或者从原始文件提取缩略图。如果失败,则加入到失败缓存中,并返回错误。
- 如果原始文件是从远程下载,或者从音频、视频流中提取,将源文件加入到全尺寸缓存中。
- 缩放图片文件到指定大小,加入到缩略图缓存中,并返回。
磁盘缓存包括三部分,全尺寸图片缓存、缩略图缓存、失败缓存。
- 全尺寸缓存:主要保存从远程图片服务器获取的图片和从音频、视频文件中提取的图片。由于这些来源的图片获取成本比较高,这些图片以原始尺寸进行保存。默认该缓存大小为50MB,采用最近最少使用方式进行替换,可以通过修改data/com.canonical.Unity.Thumbnailer.gschema.xml文件中的full-size-cache-size节点数据来重新设置缓存大小。
- 缩略图缓存:保存为调用者生成的指定尺寸的缩略图。该缓存大小默认为100MB,同样可以通过修改thumbnail-cache-size节点数据来重新设置缩略图缓存大小。
- 失败缓存:保存由于异常导致缩略图提取失败的项。对于远程文件,可能是因为无法获取远程文件(文件不存在、授权失败等);对于本地文件,可能是因为文件损坏或者音频文件不包含插图等。失败缓存主要用于减少对已知错误的重复尝试,对于该缓存中的内容,采用最近最少使用和指定过期时间的方式控制缓存失效。
同时,缩略图服务还提供了命令行工具thumbnailer-admin,是得能够通过命令行操作上述两个DBus接口。 为了节省资源,DBus接口由DBus服务启动,在30秒空闲后关闭。
系统架构
音频、视频提取器使用GStreamer来解码音频和视频文件。由于GStreamer自身的稳定性问题,部分解码器可能会导致程序挂起失去响应,因此将和GStreamer交互部分单独封装成独立的可执行程序vs-thumb。主服务通过管道的形式和它交互,很好的避免了因为解码器崩溃导致的稳定性问题。
缩略图服务中的每个模块都有清晰的接口定义。支持新的媒体类型或者新的远程图片服务扩展非常容易,不会影响到现有代码。
缩略图服务的主要耗时在基于网络的下载和基于CPU的图片提取。因此对性能的提升,主要考虑在网络IO和CPU利用率上。为了避免这两个耗时的操作阻塞其他请求,特别是能够可以从缓存模块中快速响应的请求,下载和图片抽取被放在独立的事件循环中,利用Qt的信号和槽机制,将耗时请求异步化。
Qt API:提供了三个函数获取特定类型的缩略图
- QSharedPointer getThumbnail(QString const& filePath, QSize const& requestedSize);
- QSharedPointer getAlbumArt(QString const& artist, QString const& album, QSize const& requestedSize);
- QSharedPointer getArtistArt(QString const& artist, QString const& album, QSize const& requestedSize);
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/news/a13377.html
相关文章 Recommend
- • 如何为实时性应用存取经纬度?django mysql
- • 为什么我的web.pydb.select返回的数据只能遍历一次
- • 为什么读取通过cookielib方法得到的cookies返回值是
- • Python正则表达式匹配不成功,值为None
- • 要做跨平台客户端的软件,用哪种编程语言最适合
- • 为什么PIL只有8位BMP灰度图数据无法修改
- • Python什么方法可以将XML转换为JSON格式
- • python语言中为什么说getter和setter用起来很傻
- • 我的网站爬虫python代码为什么不能正常运行,哪里
- • python2.7函数删除一个全局变量为什么不报SyntaxE
- • Ubuntu火狐浏览器可以用python脚本来控制吗?
- • ubuntu卸载python2.7再重装的问题
必知PYTHON教程 Must Know PYTHON Tutorials
- • python 解释器
- • python idle
- • python dir函数
- • python 数据类型
- • python type函数
- • python 字符串
- • python 整型数字
- • python 列表
- • python 元组
- • python 字典
- • python 集合
- • python 变量
- • python print
- • python 函数
- • python 类定义
- • python import
- • python help
- • python open
- • python 异常处理
- • python 注释
- • python continue
- • python pass
- • python return
- • python global
- • python assert
- • python if语句
- • python break
- • python for循环
- • python while循环
- • python else/elif
- • lambda匿名函数
必知PYTHON模块 Must Know PYTHON Modules
- • os 模块
- • sys 模块
- • re 正则表达式
- • time 日期时间
- • pickle 持久化
- • random 随机
- • csv 模块
- • logging 日志
- • socket网络通信
- • json模块
- • urlparse 解析URL
- • urllib 模块
- • urllib2 模块
- • robotparser 解析
- • Cookie 模块
- • smtplib 邮件
- • Base64 编码
- • xmlrpclib客户端
- • string 文本
- • Queue 线程安全
- • math数学计算
- • linecache缓存
- • threading多线程
- • sqlite3数据库
- • gzip压缩解压
最新内容 NEWS
- • 2019年3月最新消息: Python 3.4.10 现已推出
- • 支付宝官方给力福利!每天可领1个红包,
- • Dino Esposito CQRS 消息以及事件看法
- • 树莓派 raspi驱动LoRaWAN基站
- • Kuzzle内部部署文档后端
- • Java 9跳票 发布时间将迟至2017年3月
- • iOS Apple 停止Ad 广告业务
- • Microsoft UWP上支持React Native
- • Angular移动工具集Web应用原生感觉
- • Windows 10周年更新Edge浏览器支持扩展
图文精华 RECOMMEND
-
支付宝官方给力福利!每天可领
-
选择Python而不选择Go语言的原因
-
Python相关的软件团队未来离不开
-
Ubuntu磁盘缓存模块提供 缩略图服
-
Python程序员,2016一起告别码农!
-
为什么企业很难招聘到好的pytho
热点文章 HOT
- 支付宝官方给力福利!每天可领1个红包,
- 使用Python语言编写的Fuzzing第三方框架
- 超级QQ这个服务有可能会整合到QQ普通会员
- 正在创业者的你是否在经历O2O的那些坑
- 索尼PlayStation TV机顶盒650RMB左右
- 你N年前可想到今天的迅雷股价如此之高
- 阿里集团的公共DNS正式发布:223.5.5.5 223.
- Apache Qpid Python 最新1.35.0 版本发布