2015-07-02 2 views
0

У меня есть одностраничное приложение с одной базой, которое нужно работать в течение нескольких часов, перемещаясь по разным маршрутам. Я создал простой скрипт на python, который запускает мой браузер и на весь экран.Утечка памяти Python WebkitGTK (функция очистки)

import sys 
from gi.repository import Gtk, Gdk, WebKit 

class BrowserWindow(Gtk.Window): 
    def __init__(self, *args, **kwargs): 
     super(BrowserWindow, self).__init__(*args, **kwargs) 

     self.connect("destroy", Gtk.main_quit) 
     self.webview = WebKit.WebView() 

     self.webview.connect("load-finished", self._load_finish) 
     self.webview.connect("navigation-requested", self._navigation_requested) 

     settings = self.webview.get_settings() 
     print settings.get_property("enable-page-cache") 
     settings.set_property("enable-page-cache", False) 
     self.webview.set_settings(settings) 
     self.webview.load_uri("http://www.google.com/") 
     self.add(self.webview) 
     self.show_all() 

    def _load_finish(self, view, frame): 
     print "Loading completed" 
     print view 

    def _navigation_requested(self, view, frame, request): 
     print "Mavigation change requested" 
     self.webview.get_back_forward_list().clear() 
     return False 

def main(): 
    Gtk.init(sys.argv) 

    window = BrowserWindow() 
    window.show() 
    window.fullscreen() 

    Gtk.main() 
if __name__ == "__main__": 
    main() 

Проблема в том, что каждый раз, когда она меняет маршруты, она увеличивает объем памяти на некоторую величину. Те, у которых больше изображений, быстрее увеличивают память. И вместо того, чтобы использовать что-либо, что в памяти, оно имеет тенденцию использовать больше памяти, но не использовать его.

Я попытался найти четкую функцию, но не получил никакой помощи. Я также пробовал QTWebkit, который имел четкую функцию, но это тоже не помогло.

+0

Какие ** конкретные ** версии webkit вы пробовали? Всегда были проблемы с использованием памяти, но некоторые из них были исправлены в более поздних версиях. – ekhumoro

+0

Также обратите внимание, что GTK на MS Windows имеет утечку памяти при каждом изменении виджетов (см. [Здесь] (http://stackoverflow.com/questions/10837776/memory-leak-in-gtk-under-windows-7-in- gtk-widget-queue-draw) и [здесь] (https://bugzilla.gnome.org/show_bug.cgi?id=685959)). Текущая версия Windows PyGTK не обновлена ​​** исправлением. Если вы работаете с окнами, единственный способ избежать утечки памяти - это создать PyGTK из исходной версии с использованием последней версии GTK. Тем не менее, могут возникнуть проблемы с webkit, как отмечает ekhumoro. –

+0

Я использую PyQT4 и/или PyWebkitGTK. Я на Debian/XFCE4 с ограниченным объемом памяти. – Techjail

ответ

0

Реальный вопрос: вы уверены, что использование памяти является реальной проблемой? Современные браузеры (и веб-просмотры) могут иметь очень сложное поведение кэширования: «имеет тенденцию использовать больше памяти, но не использует его». вполне может быть слишком упрощенной картиной ситуации.

Это означает, что WebkitGTK позволяет вам контролировать поведение кэширования: посмотрите на set_cache_model() и связанные с ним функции (они являются частью WebKitWebContext в webkit2gtk и глобальными функциями в webkitgtk).

+0

Я пытаюсь найти это на: http://webkitgtk.org/reference/webkitgtk/stable/ Можете ли вы меня более конкретно с URL-адресом с WebKitWebContext? Объем памяти достигает 40%, и это замедляет поведение страницы. – Techjail

Смежные вопросы