Запретить gtk FileChooserDialog вызывать stat для всех файлов в каталоге?
-
03-07-2019 - |
Вопрос
Открытие gtk FileChooserDialog происходит очень медленно для каталогов nfs, содержащих много файлов.strace показывает много времени, вызывая «stat».Около 5 вызовов для каждого из файлов в каталоге.Как мы можем отключить вызовы stat и просто показывать список имен файлов без времени изменения?
Мы используем операционную версию Redhat Enterprise 4, x86_64, Linux 2.6.9-42.0.8.ELsmp, а FileChooser взят из:/usr/lib64/libgtk-x11-2.0.so.0.400.13 .Тестовая программа открывает FileChooserDialog, и его появление занимает 10 секунд, по сравнению с примерно 25 мс для «ls», чтобы перечислить тот же каталог.
Наше приложение eclipse повреждено из-за этой проблемы с селектором файлов...
Решение
У команды gtk+ и gnome есть ошибка доклад, посвященный этому вопросу, по крайней мере, с 2005 года.Мы надеемся, что недавние и будущие изменения в основных библиотеках gnome улучшат производительность.Эта проблема может усугубиться, если у вас есть закладки для сетевых дисков в меню выбора файлов.
Другие советы
Диалоговое окно открытия файла GTK, скорее всего, отображает(2) все файлы в каталоге.Это эквивалент ls -l
в каталоге, и он должен работать очень медленно.Выход ls | cat
(что значительно быстрее) может быть недостаточно, поскольку невозможно отличить файлы от каталогов.
Я бы предложил измерить ls | cat
, ls -l
и диалог открытия файла GTK.Если диалог открытия файла GTK работает намного медленнее, чем ls -l
, значит что-то не так с GTK (не NFS).Я бы запустил приложение GTK через strace
, и посмотреть, что медленно.Если диалог открытия файла GTK имеет примерно такую же скорость, как ls -l
, Я не думаю, что это можно сделать быстрее - возможно, можно настроить флаги монтирования NFS, обновить клиенты и серверы NFS или можно переключиться на более быструю инфраструктуру, такую как Samba.
Каталог смонтирован noatime?Это может помочь со статистикой, поскольку время для каждого файла будет обновлено с учетом статистики.
Вам нужно будет перемонтировать монтирование nfs с помощью -o noatime, чтобы отключить обновление времени.