Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 01.09.2009
Сообщений: 59
1

QDir и экономия памяти

17.09.2012, 16:29. Показов 1393. Ответов 7
Метки нет (Все метки)

Пишу программу под ARM. Вывожу в таблицу содержимое директории расположенной на Flash с помощью QDir::entryList(). Количество файлов может быть таким, что если считывать все имеющиеся на Flash файлы памяти не хватит (объём памяти желательно экономить). Как организовать «окно» просмотра по директории с фоновой подгрузкой очередной порции файлов?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2012, 16:29
Ответы с готовыми решениями:

QDir QDir::Filters
Здраствуйте! Хочу получить список всех файлов в директории за исключением . и .. QStringList...

Экономия памяти
Здравствуйте, уважаемые программисты! Как разместить информацию о числах из массива, используя...

Экономия памяти
Доброго времени суток, не знаю как надо делать, вот и спросил, допустим есть игра, где шарик просто...

Экономия памяти
Скажите, будет ли второй вариант кода занимать меньше памяти? 1ый вариант: float a; f(a); ...

7
Эксперт С++
1933 / 1045 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
17.09.2012, 17:23 2
QDirModel Вам в помощь
0
387 / 294 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
18.09.2012, 11:26 3
Цитата Сообщение от Oleg_IT Посмотреть сообщение
подгрузкой очередной порции файлов
Я думаю тема: Циклы в отдельном потоке, должна помочь.
0
1 / 1 / 0
Регистрация: 01.09.2009
Сообщений: 59
18.09.2012, 14:11  [ТС] 4
Цитата Сообщение от l_a_m Посмотреть сообщение
QDirModel Вам в помощь
Тогда не QDirModel, а QFileSystemModel.
---------------------
The usage of QDirModel is not recommended anymore. The QFileSystemModel class is a more performant alternative.

Но это не то, что мне нужно, я сам в своём виджите отображаю имена файлов с дополнительной информацией. Хорошо бы иметь методы считывания подобные QDir::entryList, но с заданной позиции и заданное количество.

KeyGen. Вашим советом конечно воспользуюсь, но пока не знаю какой код в поток вставить.
1
Почетный модератор
11179 / 4134 / 414
Регистрация: 12.06.2008
Сообщений: 11,977
18.09.2012, 15:37 5
Как вариант, можно попробовать
C++ (Qt)
1
2
3
4
5
QDir dir("/mydir/");
for (int i=0;i<dir.count();i++)
{
  ui->textEdit->append(dir[i]);
}
Но я не уверен, что это сэкономит память. В документации есть фраза
Equivalent to entryList().at(index).
Поэтому, возможно, что он вообще сразу загружает в память всё содержимое папки.
Если у тебя такие жёсткие требования к используемой памяти, тогда лучше воспользоваться средствами ОС для этих целей.

Добавлено через 4 минуты
Посмотрел в исходниках - действительно [] вначале загружает всё содержимое папки, а потом уже к нему обращается.
Или ещё можно попробовать QListIterator
0
1 / 1 / 0
Регистрация: 01.09.2009
Сообщений: 59
18.09.2012, 15:54  [ТС] 6
Цитата Сообщение от Humanoid Посмотреть сообщение
Поэтому, возможно, что он вообще сразу загружает в память всё содержимое папки.
Если у тебя такие жёсткие требования к используемой памяти, тогда лучше воспользоваться средствами ОС для этих целей.

Добавлено через 4 минуты
Посмотрел в исходниках - действительно [] вначале загружает всё содержимое папки, а потом уже к нему обращается.
Или ещё можно попробовать QListIterator
Да, я тоже это заметил. А вот "воспользоваться средствами ОС для этих целей." очень бы не хотелось. Делал я как-то итератор по директориям на _findfirst, _findnext. Но будет ли это работать на ARM Linux? И тогда придётся несколько раз проходить по одному и тому же пути для разных фильтров. Или в QDir::entryList тоже делается один проход для каждого фильтра?

QListIterator посмотрю.
0
Почетный модератор
11179 / 4134 / 414
Регистрация: 12.06.2008
Сообщений: 11,977
18.09.2012, 17:37 7
Цитата Сообщение от Oleg_IT Посмотреть сообщение
Делал я как-то итератор по директориям на _findfirst, _findnext. Но будет ли это работать на ARM Linux?
На сколько я понимаю, _findfirst и _findnext - это для виндовса. Для юниксовых систем я нашёл scandir. Сейчас попробовал такую конструкцию:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <dirent.h>
#include <stdio.h>
 
int filter(const struct dirent *d)
{
    printf("%s\n",d->d_name);
    return 0;
}
 
int main(void)
{
    struct dirent **namelist;
    int n = scandir("/root",&namelist,filter,alphasort);
    printf("\n%i\n\n",n);
    free(namelist);
}
...вроде, работает. Но тут меня смущает возможность сортировки. Наверняка, для сортировки он вначале всё содержимое в память загрузит.

Но можно ещё таким способом сделать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <dirent.h>
#include <stdio.h>
 
int main(void)
{
    struct dirent *de;
    DIR *d = opendir("/root");
    if (d)
    {
        while (de = readdir(d))
        {
            printf("%s\n",de->d_name);
        }
        closedir(d);
    }
}
Тут теоретически не требуется читать сразу всё содержимое. Но как это всё реализовано на самом деле, я не знаю.
1
1 / 1 / 0
Регистрация: 01.09.2009
Сообщений: 59
19.09.2012, 09:07  [ТС] 8
Спасибо за примеры.
Похоже, что если реализовывать чтение директории вручную, то будут проблемы с фильтрами и сортировкой. Их или не будет или всё будет работать очень долго. Скорей всего придётся читать всё.
Посмотрю, как это в Qt реализовано, может ещё какие мысли появятся.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2012, 09:07

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Экономия памяти и справочные таблицы
Всем привет! Я не так давно работаю в Access и никак не могу уяснить для себя вот какое дело:...

Экономия памяти при упаковке данных
Здравствуйте, уважаемые программисты! Есть такая задача: Задан упорядоченный целочисленный...

Объявление массивов и передача их по ссылке, экономия памяти
Это кусок спецификации: Не могу понять, почему оба примера выше эквивалентны сначала...

Скорость или экономия памяти - что бы выбрали Вы?
...

Длина строки, sizeof, непонятный урок и экономия памяти
Всем снова здравствуйте! y9DwP32LaGc в этом эпизоде происходит нечто не совсем понятное. Автор с...

Реальна ли экономия памяти при использовании генераторов вместо массивов?
Доброго времени суток! Прочитал в книге Котерова, что при использовании генераторов и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.