Russian Qt Forum
Май 13, 2024, 14:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QWebView кэширование на диск  (Прочитано 5142 раз)
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« : Март 02, 2015, 16:45 »

Здравствуйте.
Подскажите пожалуйста, как заставить QWebView хранить кэш загруженных страниц на диске, а не в памяти?
За пару часов прога съедает до 600 мегабайт оперативки. К тому же, после выключения кэш пропадает, а хотелось бы его сохранить. То есть нужно, чтобы весь кэш сохранялся не в памяти, а на диске. А память под кэш QWebView либо вообще не использовалась, либо по минимуму.
« Последнее редактирование: Март 02, 2015, 16:47 от PinkPanther » Записан

Эвтаназия - наше хобби!
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #1 : Март 02, 2015, 17:42 »

Я этим не занимался, но вот посмотрел первую ссылку в гугле (http://www.qtcentre.org/threads/24354-using-QWebView-cache-with-QNetworkDiskCache), там устанавливают QNetworkDiskCache для объекта QNetworkAccessManager, который обслуживает QWebView (ui->webView->page()->networkAccessManager()).
Записан
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #2 : Март 02, 2015, 18:13 »

Я этим не занимался, но вот посмотрел первую ссылку в гугле (http://www.qtcentre.org/threads/24354-using-QWebView-cache-with-QNetworkDiskCache), там устанавливают QNetworkDiskCache для объекта QNetworkAccessManager, который обслуживает QWebView (ui->webView->page()->networkAccessManager()).

Спасибо, интересно.
Там вроде некоторые пишут, что при подключении кэша через менеджер QWebView начинает показывать битые страницы.
На самом деле, в QWebView имеется класс QWebSettings, а там - серия настроек, под HTML5 и т.д. Можно указать путь, где хранить страницы, квоту и т.д. Но там явно больше, чем нужно мне, а т.к. в сетевых технологиях пока не силен, подключил все, что нашел. Но приложения все равно раздуваются с каждой загруженной браузером страницей. Говорят, это баг QWebView (http://www.qtcentre.org/threads/18853-Bad-memory-usage-on-QWebView-I-think?highlight=QWebView+Cache)
Записан

Эвтаназия - наше хобби!
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Март 02, 2015, 18:38 »

Причиной может быть банальная утечка памяти в твоём коде - неудаляемые объекты и т.д. Если код 100% чист, то нужно сперва сократить количество страниц в памяти через http://doc-snapshot.qt-project.org/qt5-5.4/qwebsettings.html#setMaximumPagesInCache , например, до одной.
Записан
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #4 : Март 02, 2015, 19:03 »

Причиной может быть банальная утечка памяти в твоём коде - неудаляемые объекты и т.д. Если код 100% чист, то нужно сперва сократить количество страниц в памяти через http://doc-snapshot.qt-project.org/qt5-5.4/qwebsettings.html#setMaximumPagesInCache , например, до одной.

Код, скорее всего, чист - объекты создаются как свойства основного класса, и используются до конца работы приложения. Ну и локальные переменные в функциях, в стэке.
По поводу setMaximumPagesInCache(), сначала ставил значение 200, сейчас сократил до 50. Дело в том, что кэш, сам по себе, нужен (я нахожусь в стране, где интернет не очень быстрый). Если выключаю кэш (или принудительно чищу перед каждой перезагрузкой), время загрузки страницы вырастает в 2-3 раза, и это видно на глаз. Если бы можно было перенести кэш на диск, то на диске пусть кэширует хоть 10,000 страниц. Не жалко. Но нужна уверенность, что приложение будет им реально пользоваться.

За час автономной работы (скрипт загрузил 250 страниц, из них ~50 уникальные) приложение, с включенным оффлайн-кэшированием, захватило 80 мегабайт оперативки (на старте занимало 120, сейчас 200).
Записан

Эвтаназия - наше хобби!
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #5 : Март 07, 2015, 10:42 »

Не могу сказать, что проблема решена кардинально, но подключение дискового кэша (к QNetworkAccessManager и QWebView) несколько улучшило ситуацию.

Еще немного улучшила ситуацию функция setObjectCacheCapacities(int minimal, int maximal, int overal) объекта QWebSettings.
С помощью нее можно указать, какое количество ненужного барахла, загруженного ранее, можно позволить себе хранить в памяти.

В результате всех ухищрений приложение (параллельно работает 6 экземпляров) стало раздуваться не до 450 мегабайт за день работы, а до 200-250.

Если у кого-то есть идеи, как кардинально пресечь утечку памяти при работе QWebView, поделитесь пожалуйста.
Записан

Эвтаназия - наше хобби!
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 22.