热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用gtk.FileChooserDialog选择大量文件时,与平台相关的性能问题

我有一个pygtk程序,旨在运行Windows和Ubuntu.它是Python2.7和gtk2,带有静态绑定(即没有gobject内省).我遇到的问题存在于Ubuntu上但不存在于

我有一个pygtk程序,旨在运行Windows和Ubuntu.它是Python 2.7和gtk2,带有静态绑定(即没有gobject内省).我遇到的问题存在于Ubuntu上但不存在于Windows上.

我的程序应该能够处理大量文件(这里我用大约200个测试),但每个文件的实际处理并不多.我基于每个文件对处理进行排队,并向用户呈现进度.

问题是在用gtk.FileChooserDialog选择文件后(control-A是你的朋友),程序挂起并且gtk事件在很长一段时间内都没有处理 – 即使我的回调函数已经返回.在此期间,所有核心上的CPU使用率大约持续80%,iotop显示我的进程以每秒约20MB的速度写入磁盘,其他应用程序间歇性地无响应 – Chrome,Xorg,compiz,banshee和gedit都具有高CPU使用率(在选择文件之前使用率较低).

这是一些示例代码.要重现,请单击按钮,从某处选择大约200个文件(大约十个屏幕保持移位和向下),然后单击“确定”.什么文件无关紧要 – 没有用它们做什么.

import gtk,gobject,time
def print_how_long_it_was_frozen():
print time.time() - start_time
def button_clicked(button):
dialog = gtk.FileChooserDialog(
'Select files to add', w, gtk.FILE_CHOOSER_ACTION_OPEN,
buttOns=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_select_multiple(True)
dialog.set_default_response(gtk.RESPONSE_OK)
respOnse= dialog.run()
files = dialog.get_filenames()
dialog.destroy()
for i, f in enumerate(files):
print i
global start_time
start_time = time.time()
gobject.idle_add(print_how_long_it_was_frozen)
w = gtk.Window()
b = gtk.Button('Select files')
w.add(b)
b.connect('clicked', button_clicked)
w.show_all()
gtk.main()

这导致回调结束后约60秒挂起,在此期间除了处理对话框的破坏(在挂起的中途发生)之外不会发生任何事情.

这是在Ubuntu 11.10上.在Windows上,挂起的时间不到一秒钟.

我怀疑这是由于某些Gnome或Unity最近的文件功能,或其他活动跟踪.进程zeitgeist-daemon在挂起期间也有很高的CPU使用率,虽然查杀它并不能解决问题.也没有使用Zeitgeist活动日志管理器禁用日志记录.即使可以禁用Zeitgeist,我也不能指望我的用户禁用它.

有谁知道如何禁用gtk应用程序报告最近的文件,或知道可能导致此问题的任何其他内容?

相反,必须通过“选择文件夹”对话框添加非常大量的文件进行处理,但对于较少数量的文件,每个文件的挂起时间似乎约为半秒,否则对于其他文件来说这是不可接受的.响应式应用.

(测试是在32位Windows 7和64上进行的,但是Ubuntu 11.10.两者都是Python 2.7和pygtk 2.24)

解决方法:

减速是由于gtk.FileChooser小部件automatically将所有选定的文件放入最近使用的文件列表(gtk.RecentManager.add_item()).

在示例代码中添加此函数在单独的线程中运行(并且在挂起期间似乎没有问题获取gtk锁):

def log_n_recent_files():
manager = gtk.recent_manager_get_default()
manager.purge_items()
while True:
time.sleep(1)
with gtk.gdk.lock:
items = manager.get_items()
with open('log.log','a') as f:
f.write('%f %d\n'%(time.time(), len(items)))

揭示(在隔夜运行之后)每个文件的延迟随着最近文件数量的增加而增加:

由于没有方法可以向RecentManager添加多个文件,因此每次添加一个文件.

每次添加一个,其他gtk应用程序会收到通知,即最近的文件列表(存储在〜/ .local / share / recent-used.xbel中)已更改.然后,他们解析文件并遍历项目,查找n个最新项目(其中n是特定于应用程序),以显示它们.在确定哪些文件是最新的时,每个项目为a system time call is made.

最近使用的xbel能够grow without limit这个事实加剧了这个问题.所以如果你在最近使用过的xbel中有5000个项目,并且你选择了带有gtk.FileChooser的200个文件,那么你将获得(总和)从n = 1到200)(5000 n)~100万系统时间调用每个gtk app运行.

gtk.Settings中有属性可以让你的应用程序查找历史记录中较少的文件,gtk-recent-files-limit和gtk-recent-files-max-age,但是它们不会阻止〜/ .local / share /最近用过的.来自写的.

为了防止最近使用过的xbel被写入,可以写保护它,或者用文件夹替换它.在这种情况下,gtk仍然会尝试添加所有文件,但每次尝试都会失败.每200个文件的延迟大约是1秒 – 我想这次尝试的开销仍然很大.

由于似乎无法关闭gtk.FileChooser的这种行为,唯一的另一种方法是使用不同的filechooser小部件.即使使用30000个文件,使用不推荐使用的gtk.FileSelection小部件时也没有明显的延迟.

这是一个丑陋的小部件,但我想我将不得不使用它并提交错误报告/功能请求,以便能够通过gtk.FileChooser禁用最近的文件报告.


推荐阅读
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 本文旨在解决 MySQL 无法连接到 localhost 的常见问题,并提供详细的步骤来确保 MySQL 服务正确启动和配置。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • This feature automatically validates new regions using the AWS SDK, ensuring compatibility and accuracy. ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
author-avatar
mimiku2z_818
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有