GtkTreeView 由于排序而导致插入/更新性能损失

2023-12-25

在将许多行插入 GTK 树视图(使用 PyGTK)或修改许多行时,我遇到了性能问题。问题是模型似乎在每次更改(插入/修改)后都会被重新使用。这会导致 GUI 挂起数秒。通过注释使模型不排序model.set_sort_column_id(SOME_ROW_INDEX, gtk.SORT_ASCENDING)消除了这些问题。

因此,我想在插入或修改模型时禁用排序,然后重新启用它。不幸的是,排序不能被禁用model.set_sort_column_id(-1, gtk.SORT_ASCENDING)。使用冻结/解冻功能也不起作用:

treeview.freeze_child_notify()

try:
    for row in model:
        # ... change something in row ...
finally:
    treeview.thaw_child_notify()

那么,如何禁用排序呢?或者有更好的批量插入/修改方法吗?


Solution

感谢 bobince 在他的回答中提供的信息和链接,我检查了一些替代方案:

1)虚拟排序

 tv.freeze_child_notify()
 sortSettings = model.get_sort_column_id()
 model.set_default_sort_func(lambda *unused: 0) # <-- can also use None but that is slower!
 # model.set_default_sort_func(lambda *unused: 1) <-- slow
 # model.set_default_sort_func(lambda *unused: -1) <-- crash (access violation in gtk_tree_store_move_after?!)
 model.set_sort_column_id(-1, gtk.SORT_ASCENDING)
 # change rows
 model.set_sort_column_id(*sortSettings)
 tv.thaw_child_notify()

这使得时间从大约 11 秒缩短到 2 秒。哇!但还可以更好,这仅适用于 1000 行。

2)更新时删除模型

tv.set_model(None)
# change rows
tv.set_model(model)

没有明显差异,11 秒。

3)虚拟排序和酷生成器技巧

 def gen():
      tv.freeze_child_notify()
      sortSettings = model.get_sort_column_id()
      model.set_default_sort_func(lambda *unused: 0)
      model.set_sort_column_id(-1, gtk.SORT_ASCENDING)

      i = 0
      for row in rowsToChange:
           i += 1
           # change something
           if i % 200 == 0:
                # freeze/thaw not really  necessary here as sorting is wrong because of the
                # default sort function
                yield True

      model.set_sort_column_id(*sortSettings)
      tv.thaw_child_notify()
      yield False

 g = gen()
 if g.next(): # run once now, remaining iterations when idle
     gobject.idle_add(g.next)

结果:与解决方案 1) 中的估计时间相同,为 2 秒,但 GUI 在此期间做出反应。我更喜欢这种方法。如果需要,可以调整模 200 以使 GUI 或多或少具有反应性。

也许甚至可以子类化gtk.TreeStore以获得更好的结果?还没有尝试过,但选项 3) 目前就足够了。


听起来你已经快到了。请参阅进一步说明。特别是,您还应该设置default_sort_order(您现在可以使用None以及该示例中的虚拟比较 lambda,以获得更好的性能)以确保没有排序,并在操作期间从树视图中删除模型。

如果有很多更改,您最好创建并设置一个完整的新模型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GtkTreeView 由于排序而导致插入/更新性能损失 的相关文章

  • mkbundle 和 GTK#

    我正在尝试使用 mkbundle 以便我可以分发 GTK 应用程序 而无需用户安装 NET Mono 或 GTK 我已经成功捆绑了一个使用 winforms 的应用程序 但由于某种原因 当我对 GTK 应用程序执行相同操作时 它无法工作 这
  • mongodb C# 驱动程序中 InsertBatch 方法的最佳批量项目计数是多少?

    我听说大批量并不能真正提供任何额外的性能 什么是最优的 如果您调用 Insert 一次插入一个文档 则每个文档都会有一次网络往返 如果您调用 InsertBatch 批量插入文档 则每个批次 而不是每个文档 都会有一个网络往返 Insert
  • 如何使用 Powershell 3 增加并行进程数?

    我正在尝试并行运行 20 个进程 我如下更改了会话 但没有运气 我每个会话最多只能有 5 个并行进程 wo New PSWorkflowExecutionOption MaxSessionsPerWorkflow 50 MaxDisconn
  • 如何获取图标名称的完整文件路径?

    如何从 GNOME 中的图标名称获取完整文件路径 import gtk icon theme gtk icon theme get default icon info icon theme lookup icon my icon name
  • 如何获得 GTK 中的默认颜色?

    Context 在 GTK 3 中 人们可以设置自己的主题 甚至默认主题 Adwaita 也提供两种变体 浅色和深色 当我编写自己的小部件 用Python 时 我需要获取这些颜色以避免在黑色上绘制黑色或在白色上绘制白色 Question 如
  • PyGTK:带线程的 gobject.idle_add() 和 timeout_add()

    是否有任何明确的文档说明idle add timeout add 和 或它们安装的实际回调是否需要锁 任何类型 def work args 1 gtk gdk threads enter needed self ui change some
  • Python GTK 信号处理程序不工作

    我正在使用 GTK 为 GUI 编写一个 Python 应用程序 我注意到从终端使用 Ctrl C 关闭它不起作用 我发现这是因为一个错误 所以我尝试手动处理该信号 问题是 如果我将默认行为设置为默认行为 则会捕获信号并正确关闭应用程序 但
  • GTK 滚动窗口 - 将滚动条保持在底部

    我有一个使用 ScrolledWindow 的 GTK C 程序 我不断将数据添加到滚动窗口内的列表中 并且我想将注意力集中在最新的项目上 但我还想允许用户滚动数据以选择旧项目 有没有办法做到这一点 我到处都找过了 但什么也没找到 我不太清
  • 在 GTK+ (gtkD) 中处理按键

    我正在玩gtkD http www dsource org projects gtkd GTK 的 D 绑定 我有一个window对象 实例gtk MainWindow 我想处理它的按键 How 如何处理特殊键 例如箭头键 pgup pgd
  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • 小部件之间的自定义信号

    尝试将信号从一个 gtk EventBox 子级发送到另一个 在 init HeadMode 第 75 行 上出现错误 类型错误 未知信号名称 消息发送 why usr bin env python coding utf8 import p
  • 使用 GTK+ 使用 gtk_event_put 和 GdkEventButton 结构模拟按钮单击

    这是后续如何将合成鼠标事件插入 X11 输入队列 https stackoverflow com questions 10319519 how to insert synthetic mouse events into x11 input
  • 在flatpak项目中使用scrapy脚本

    我正在构建一个 flatpak 构建的项目 我有一个按钮 当单击它时我希望它运行 scrapy 脚本来抓取数据 窗口用户界面
  • 在哪里可以找到有关 Gtkmm 的良好文档? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 似乎很难找到有关 Gtkmm 主题的高质量文档 Gtkmm 有好的文档吗 如果有的话 我在哪里可以找到
  • gtk 最小尺寸

    有没有一种简单的方法来要求 GTK 小部件具有最小宽度 高度 我知道你可以在a列上做到这一点TreeView 但是它适用于一般的小部件吗 对于 C C gtk widget set size request http library gno
  • 对于 pygtk 应用程序来说,什么是好的嵌入式浏览器?

    我计划在我的 pygtk 应用程序中使用嵌入式浏览器 并且我正在 gtkmozembed 和 pywebkitgtk 之间进行辩论 两者之间有什么引人注目的区别吗 还有我不知道的第三种选择吗 应该注意的是 我不会使用它来访问网络上的内容 我
  • 重写 PyGObject 中的虚拟方法

    我正在尝试实施高宽几何管理 http developer gnome org gtk3 3 2 GtkWidget html geometry management在 GTK 和 Python 中用于我的自定义小部件 我的小部件是来自的子类
  • 在菜单中显示 gtk.Calendar?

    我想构建一个上下文菜单 其中包含用于选择日期的菜单项 用例是在树视图中选择一堆项目 然后为所有项目设置新的截止日期 由于菜单项是 Gtk Bin 因此我可以指定任何小部件来代替标签 然而 我似乎无法interact与小部件 如果我单击菜单上
  • 将 Glade 与 pygobject Gtk3 一起使用

    我正在使用迁移指南将脚本转换为使用 Gtk3 将 GTK2 移植到 GTK3 http live gnome org PyGObject IntrospectionPorting Porting from PyGTK 2 to PyGI G
  • 如何使用 Bolt 协议将对象数组(批量插入)插入到 Neo4j 中(javascript)

    1 将带有对象数组的http post发送到服务器 id 1 title one id 2 title two 2 在服务器上接收帖子并使用bolt批量插入neo4j let data req body set up bolt let db

随机推荐

  • 等待进程结束异步,然后调用主窗体中的函数

    我正在用 C 编写一个游戏编辑器 我的程序通过启动 notepad exe 进程以 txt 文件打开 如果该进程退出 我想调用主窗体中的函数 以更新文本框 这是我到目前为止正在做的事情 void OpenTextEditor TreeNod
  • 从大表读取时出现 java.lang.OutOfMemoryError

    我正在尝试从 PostgreSQL 中的一个非常大的表 300GB 预先生成报告 我做了这样的事情 rs stmt executeQuery SELECT FROM tbl System out println select all fin
  • jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到)

    我看到有关文件的错误消息 min map 未找到 GET jQuery 的 jquery 1 10 2 min map 正在触发 404 未找到 截屏 这是从哪里来的 如果 Chrome DevTools 报告 map 文件的 404 可能
  • 循环比较宏

    我已经使用 Word 完成了一个文本比较宏 我需要循环它 以便它可以在几组文档之间进行比较 关于如何做到这一点有什么想法吗 这是我的代码 Dim template1 As Word Document Dim spool1 As Word D
  • Sqlalchemy:查询多态类的 m2m 关系

    我有两个通过多对多关系连接的类 Parent and Tag Base declarative base association table Table associations Base metadata Column parent id
  • Proguard 在不混淆的情况下进行收缩和优化

    在我的应用程序中 我有库项目依赖项 其中包含许多未使用的方法字段和类 由于这是一个第三方库 我不想自己删除所有未使用的类和方法 因为它是未来的更新 我正在尝试为此使用混淆器 但是 dontobfuscate 只会将整个项目排除在任何优化 缩
  • PHP 编译器 xdebug 警告

    PHP 新手 从事 PHP 项目并启用 xdebug 以便能够调试我的 PHP 应用程序 生产服务器没有启用 xdebug 因为它是由另一个团队处理的 在我的本地计算机上 当我运行 Composer 时 它会给我一个警告 You are r
  • 当只有一个子项可用时,最后一个子项样式会覆盖第一个子项样式

    ul li first child a border radius 5px 5px 0 0 ul li last child a border radius 0 0 5px 5px 当只有一个子项时 最后一个子项样式将覆盖第一个子项样式 有
  • Mysql 容器无法在 Kubernetes 上启动

    我正在使用this https hub docker com layers bitnami mysql 5 7 images sha256 87d11d41343c5404073f13b555e2849db4cb975f10e9b84ff4
  • pcntl_fork 在 PHP 中如何工作?

    我很困惑pcntl fork http php net pcntl fork in PHP 我认为它具有多线程功能 但它是如何工作的以及如何在脚本中使用它 PCNTL 不能创建线程 它仅 分叉 当前的 PHP 进程 这是什么意思 你打电话时
  • 无需更改 .NET 中的代码即可启用 TLS 1.2

    我有 NET 4 5 2 应用程序正在使用SmtpClient发送电子邮件 该应用程序安装在Windows 2012 R2服务器上 当我禁用 TLS 1 和 TLS 1 1 并仅启用 TLS 1 2 时 应用程序停止发送邮件 我认为这是因为
  • Android ViewPager 页面片段之间的填充/边距

    Android Market Google Music 似乎能够在包含在其中的不同片段之间存在某种间隙 ViewPager 知道这是如何做到的吗 向实际片段视图添加边距 填充不起作用 因为视图仍然需要占据屏幕的整个宽度 间隙 仅在滑动 Vi
  • 有某种方法可以禁用 Angular 2 中的一组输入吗?

    我在 md card 中有一些输入 有一种方法可以这样做
  • Bison/Yacc 语法中的无意串联

    我正在尝试 lex 和 yacc 并遇到了一个奇怪的问题 但我认为最好在详细说明问题之前向您展示我的代码 这是我的词法分析器 include
  • 如何有效地将阵列旋转±180°?

    对于 C 语言和衍生物 Python Cython 纯 C 使用最少的内存和操作将非方形 M N 数组绕其中心旋转 180 的最佳算法是什么 假设out是一个初始化的副本array M and N它们的行数和列数 我们使用从 0 到 M 1
  • Javascript 从 toLocaleDateString 解析日期以获取已知区域设置

    背景 在我的应用程序中 我想根据用户的区域设置设置日期格式 如果用户修改日期 我希望能够将其解析回 javascript Date 对象 Problem 我想知道是否可以使用 javascript 从本地格式化的字符串中解析日期 请考虑以下
  • PST 到 CSV 文件转换

    有谁知道通过命令行将 pst 转换为 csv 文件的好工具 您可以假设计算机上安装了 Outlook 吗 如果是这样 我相信它可以使用 OLE 或类似的东西进行后台脚本编写 我已经使用 Ruby 通过 Excel 完成了文件转换 这是一个P
  • 有没有办法将 SharedPreferences 存储到 SD 卡上?

    我编写了一个具有多个硬编码设置 例如 fontSize 或 targetDirectory 的应用程序 我希望能够偶尔更改这些类型的设置 SharedPreferences 似乎是解决此问题的一种方法 但我想共享此应用程序和设置 并且我的手
  • 使用参数从终端运行 Jython 脚本

    我想从命令行调用 Jython 脚本 例如 Applications Fiji app Contents MacOS ImageJ macosx headless little jython script py 我了解 Python 以及
  • GtkTreeView 由于排序而导致插入/更新性能损失

    在将许多行插入 GTK 树视图 使用 PyGTK 或修改许多行时 我遇到了性能问题 问题是模型似乎在每次更改 插入 修改 后都会被重新使用 这会导致 GUI 挂起数秒 通过注释使模型不排序model set sort column id S