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

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

Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: Остановка рекурсии поиска файлов [РЕШЕНО]  (Прочитано 26065 раз)
V1KT0P
Гость
« Ответ #45 : Март 14, 2012, 14:16 »

самое смешное на маленьком количестве файлов - работают оба нормально, но свыше 50000 файлов - ошибаются, отследить потерю нереально))), вот почему и прошу посмотреть разницу в коде

можно попробовать писать найденные файлы в текстовый файл а потом какой-то софтиной сравнивать текст....
Да все очень просто, сделай две функции и запускай их по очереди. У тебя получится два списка файлов. И дальше из второго удаляешь все файлы что есть в первом ну и наоборот тоже и если все получится прозреваешь.
Записан
daimon
Гость
« Ответ #46 : Март 14, 2012, 14:18 »

самое смешное на маленьком количестве файлов - работают оба нормально, но свыше 50000 файлов - ошибаются, отследить потерю нереально))), вот почему и прошу посмотреть разницу в коде

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

хитро пробую))

первое, что увидел - методу с одним циклом не нравятся конструкции файлов с несколькими точками и большими буквами под разрешения

попробовал сделать замер по времени: один цикл иногда выигрывает на 1 секунду, а иногда и на 2 минуты на 50000 файлов ничего не пойму почему

думаю просто другой алгоритм срабатывает сразу после первого и может происходит кеширование как-то
« Последнее редактирование: Март 14, 2012, 16:13 от daimon » Записан
V1KT0P
Гость
« Ответ #47 : Март 14, 2012, 15:54 »

первое, что увидел - методу с одним циклом не нравятся конструкции файлов с несколькими точками и большими буквами под разрешения
Там где лишний файл находит разобрался? Если скопировал то что я выкладывал то я там первоначальную директорию тоже считал. Щас сам попробую проверить =).
Записан
daimon
Гость
« Ответ #48 : Март 14, 2012, 16:12 »

первое, что увидел - методу с одним циклом не нравятся конструкции файлов с несколькими точками и большими буквами под разрешения
Там где лишний файл находит разобрался? Если скопировал то что я выкладывал то я там первоначальную директорию тоже считал. Щас сам попробую проверить =).
нет не разобрался пока ещё)

сейчас максимально подгоню алгоритмы к идентичности, чтобы эмит шел только при проходе всей директории (может из-за этого пока алгоритм с одни циклом проигрывает)

на данный момент алгоритм с одним циклом ищет правильно количество файлов, но медленнее работает, ищу почему с 2 циклами находит лишний файл

Код
C++ (Qt)
QStringList CFileFindThread::getListFilesFind( const QString &pathr, QStringList filters )
{
QStack<QString> dirs;
QString path;
QStringList listFiles;
 
m_countFiles = 0;
 
if(pathr.isEmpty())
path = QDir::currentPath();
else
path = pathr;
dirs.push(path);
 
 
while (!dirs.isEmpty()) {
path = dirs.pop();
QDir dir(path);
 
if(!dir.exists())
continue;
 
foreach (QString file, dir.entryList(filters)) ///////////видит папку как файл!!!!!!!!!!!!!!!!!!!!! если имя microsoft.cpp
              {
listFiles << QFileInfo(dir, file).absoluteFilePath();
m_countFiles++;
}
 
emit currentCountFiles(m_countFiles);
 
foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)){
dirs.push(path + QDir::separator() + subDir);
}
}
 
return listFiles;
}

Код
C++ (Qt)
QStringList CFileFindThread::getListFilesFindOld( const QString &pathr, QStringList filters )
{
 
QStack<QString> dirs;
QString path;
QStringList listFiles;
 
m_countFiles = 0;
 
if(pathr.isEmpty())
path = QDir::currentPath();
else
path = pathr;
dirs.push(path);
 
 
while (!dirs.isEmpty()) {
path = dirs.pop();
QDir dir(path);
 
if(!dir.exists())
continue;
 
foreach (QString file, dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot))// медленней работает алгоритма с двумя циклами
{
QFileInfo temp(dir,file);
 
if(temp.isDir())
dirs.push(path + QDir::separator() + file);
 
else if(m_FilterNames.contains("*." + temp.suffix(), Qt::CaseInsensitive))
{
listFiles << QFileInfo(dir, file).absoluteFilePath();
m_countFiles++;
emit currentCountFiles(m_countFiles);
}
}
 
}
return listFiles;
}

нашел ошибку алгоритма с двумя циклами, лишний файл - папка
« Последнее редактирование: Март 14, 2012, 16:32 от daimon » Записан
V1KT0P
Гость
« Ответ #49 : Март 14, 2012, 16:51 »

нет не разобрался пока ещё)
Вот собрал красивенький тестовый проект, ищет одинаковое количество что с одни что с двумя циклами. И с одним циклом у меня быстрее:
http://rghost.ru/37019164.
Записан
daimon
Гость
« Ответ #50 : Март 14, 2012, 17:03 »

всё поправил - ищет правильные файлы, сделал замер по работе, дебаг версия, релиз версия ищет в 2 раза дольше, думаю из-за очень частого эмита!!!!!!
Код
C++ (Qt)
QStringList CFileFindThread::getListFilesFind( const QString &pathr, QStringList filters )
{
QStack<QString> dirs;
QString path;
QStringList listFiles;
 
m_countFiles = 0;
 
if(pathr.isEmpty())
path = QDir::currentPath();
else
path = pathr;
dirs.push(path);
 
 
while (!dirs.isEmpty()) {
path = dirs.pop();
QDir dir(path);
 
if(!dir.exists())
continue;
 
foreach (QString file, dir.entryList(filters, QDir::Files))
              {
listFiles << QFileInfo(dir, file).absoluteFilePath();
m_countFiles++;
}
 
emit currentCountFiles(m_countFiles);
 
foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)){
dirs.push(path + QDir::separator() + subDir);
}
}
 
return listFiles;
}

Код
C++ (Qt)
QStringList CFileFindThread::getListFilesFindOld( const QString &pathr, QStringList filters )
{
 
QStack<QString> dirs;
QString path;
QStringList listFiles;
 
m_countFiles = 0;
 
if(pathr.isEmpty())
path = QDir::currentPath();
else
path = pathr;
dirs.push(path);
 
 
while (!dirs.isEmpty()) {
path = dirs.pop();
QDir dir(path);
 
if(!dir.exists())
continue;
 
foreach (QString file, dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot))// медленней работает алгоритма с двумя циклами
{
QFileInfo temp(dir,file);
 
if(temp.isDir())
dirs.push(path + QDir::separator() + file);
 
else if(m_FilterNames.contains("*." + temp.suffix(), Qt::CaseInsensitive))
{
listFiles << QFileInfo(dir, file).absoluteFilePath();
m_countFiles++;
emit currentCountFiles(m_countFiles);
}
}
 
}
return listFiles;
}


« Последнее редактирование: Март 14, 2012, 17:22 от daimon » Записан
V1KT0P
Гость
« Ответ #51 : Март 14, 2012, 17:08 »

всё поправил - ищет правильные файлы, сделал замер по работе, дебаг версия
Release верси. Слева один цикл, справа два цикла. Время в миллисекундах.
Записан
daimon
Гость
« Ответ #52 : Март 14, 2012, 17:44 »

поправил вроде везде - скрыл ключи для скрытых файлов и системных, поставил фильтр на h, cpp
« Последнее редактирование: Март 14, 2012, 17:58 от daimon » Записан
V1KT0P
Гость
« Ответ #53 : Март 14, 2012, 18:08 »

поправил вроде везде - скрыл ключи для скрытых файлов и системных, поставил фильтр на h, cpp
Блин я попутал, там слева это два цикла, а справа один. Вроде все правильно, с одним циклом быстрее.
Только вот почему у меня с одним циклом медленнее получается?

добавлено:
Хотя нет, на очень большом количестве файлов одиночный цикл быстрее.
« Последнее редактирование: Март 14, 2012, 18:20 от V1KT0P » Записан
daimon
Гость
« Ответ #54 : Март 14, 2012, 18:47 »

поправил вроде везде - скрыл ключи для скрытых файлов и системных, поставил фильтр на h, cpp
Блин я попутал, там слева это два цикла, а справа один. Вроде все правильно, с одним циклом быстрее.
Только вот почему у меня с одним циклом медленнее получается?

добавлено:
Хотя нет, на очень большом количестве файлов одиночный цикл быстрее.

Код
C++ (Qt)
QStringList CFileFindThread::getListFilesFindOld( const QString &pathr, QStringList filters )
{
 
QStack<QString> dirs;
QString path;
QStringList listFiles;
 
m_countFiles = 0;
 
if(pathr.isEmpty())
path = QDir::currentPath();
else
path = pathr;
dirs.push(path);
 
 
while (!dirs.isEmpty()) {
path = dirs.pop();
QDir dir(path);
 
if(!dir.exists())
continue;
 
foreach (QString file, dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot))
{
QFileInfo temp(dir,file);
 
if(temp.isDir())
dirs.push(path + QDir::separator() + file);
 
else if(m_FilterNames.contains("*." + temp.suffix(), Qt::CaseInsensitive))
{
listFiles << QFileInfo(dir, file).absoluteFilePath();
m_countFiles++;
emit currentCountFiles(m_countFiles);
}
}
 
}
return listFiles;
}

при 51768 файлов на 3 секунды медленней от 2 циклов, не пойму чего?
Записан
V1KT0P
Гость
« Ответ #55 : Март 14, 2012, 19:16 »

при 51768 файлов на 3 секунды медленней от 2 циклов, не пойму чего?
Ты на холостом ходе проверь. Может тормозит проверка подходящего имени?
Записан
daimon
Гость
« Ответ #56 : Март 14, 2012, 19:34 »

при 51768 файлов на 3 секунды медленней от 2 циклов, не пойму чего?
Ты на холостом ходе проверь. Может тормозит проверка подходящего имени?
отправляю С:/ и фильтр *.cpp *.h

как тестировать?
Записан
V1KT0P
Гость
« Ответ #57 : Март 14, 2012, 19:36 »

при 51768 файлов на 3 секунды медленней от 2 циклов, не пойму чего?
Ты на холостом ходе проверь. Может тормозит проверка подходящего имени?
отправляю С:/ и фильтр *.cpp *.h

как тестировать?
без фильтра.

добавлено:
Блин во я туплю. Одиночный цикл тупит из-за того что в нем каждый цикл создается объект QFileInfo и проиходит проверка на директорию. Это походу очень много времени занимает. Так что с двумя циклами наверно будет все-же быстрее.
« Последнее редактирование: Март 14, 2012, 19:41 от V1KT0P » Записан
V1KT0P
Гость
« Ответ #58 : Март 14, 2012, 19:48 »

Вот правильный одиночный цикл, сразу уделывает двойной =):
Код
C++ (Qt)
foreach (QFileInfo file, dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)) {
   if(file.isDir()) {
       ++currentNumberFile;
       dirs.push(file.absoluteFilePath());
   } else {
       *listFiles << file.absoluteFilePath();
   }
}
« Последнее редактирование: Март 14, 2012, 19:51 от V1KT0P » Записан
daimon
Гость
« Ответ #59 : Март 14, 2012, 20:28 »

Вот правильный одиночный цикл, сразу уделывает двойной =):
Код
C++ (Qt)
foreach (QFileInfo file, dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)) {
   if(file.isDir()) {
       ++currentNumberFile;
       dirs.push(file.absoluteFilePath());
   } else {
       *listFiles << file.absoluteFilePath();
   }
}
тут есть одна маленькая вещь, которая важна - фильтр
Записан
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


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