Russian Qt Forum
Март 29, 2024, 16:58
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Последовательное открытие большого количества файлов
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Последовательное открытие большого количества файлов (Прочитано 4410 раз)
YvenTitan
Самовар
Offline
Сообщений: 174
Последовательное открытие большого количества файлов
«
:
Октябрь 13, 2022, 17:22 »
Здравствуйте
У меня задача передать по сети около 100 000 файлов размером от 100 килобайт до 1 мегабайта. Скорость важна.
Проблема в том, что на открытие каждого файла уходит около 30 миллисекунд. При этом передача файла идет меньше 10 мс.
Если файлов не 100 000, а 1500, то работает нормально. Если 2000, то медленно открывает.
Тестовый код такой (тут не посылаю никуда файл):
Код:
#include <QCoreApplication>
#include<QFile>
#include<QDir>
#include<QTime>
#include<QDebug>
const QString folderPath = "D:\\ForSend\\FolderSend";
const QChar subdirSeparator = '\\';
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir dir(folderPath);
QStringList dirFiles = dir.entryList(QDir::Files|QDir::NoDotAndDotDot|QDir::Hidden);
for (QStringList::const_iterator it = dirFiles.begin(); it != dirFiles.end(); ++it) {
QString fullPath1 = folderPath + subdirSeparator + *it;
QFile f(fullPath1);
QTime t1 = QTime::currentTime();
f.open(QIODevice::ReadOnly);
QTime t2 = QTime::currentTime();
f.close();
qDebug() << t1 << endl << t2 << endl << *it;
}
return a.exec();
}
Операционная система: Windows 10. Замена QFile на FILE* в стиле С не меняет дело.
Подскажите, пожалуйста, в чем может быть причина задержки при открытии файлов?
«
Последнее редактирование: Октябрь 13, 2022, 18:41 от YvenTitan
»
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4725
Re: Последовательное открытие большого количества файлов
«
Ответ #1 :
Октябрь 13, 2022, 22:46 »
в файловой системе и/или ОС
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
YvenTitan
Самовар
Offline
Сообщений: 174
Re: Последовательное открытие большого количества файлов
«
Ответ #2 :
Октябрь 14, 2022, 09:35 »
Что можно сделать, чтобы избежать больших задержек при открытии файлов?
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4725
Re: Последовательное открытие большого количества файлов
«
Ответ #3 :
Октябрь 14, 2022, 10:05 »
если надо просто передать столько файлов, проще сделать это в архиве (может быть в нескольких)
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
YvenTitan
Самовар
Offline
Сообщений: 174
Re: Последовательное открытие большого количества файлов
«
Ответ #4 :
Октябрь 14, 2022, 10:21 »
Одно из условий задания - передавать много маленьких файлов
Может что-то с таблицей дескрипоров происходит (например, переполнение), но я не знаю, как проверить это гипотезу
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4725
Re: Последовательное открытие большого количества файлов
«
Ответ #5 :
Октябрь 14, 2022, 10:39 »
попробуй передавать пачками по паре тысяч. как только текущая пачка передалась, запускаешь следующую.
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
YvenTitan
Самовар
Offline
Сообщений: 174
Re: Последовательное открытие большого количества файлов
«
Ответ #6 :
Октябрь 14, 2022, 10:49 »
Ты имеешь в виду, открыть сразу пару тысяч файлов, передать, закрыть; после этого опять открыть пару тысяч файлов, передать и закрыть?
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4725
Re: Последовательное открытие большого количества файлов
«
Ответ #7 :
Октябрь 14, 2022, 12:17 »
ну примерно, да. можно еще небольшие задержки попробовать ставить между пачками.
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
YvenTitan
Самовар
Offline
Сообщений: 174
Re: Последовательное открытие большого количества файлов
«
Ответ #8 :
Октябрь 14, 2022, 16:26 »
Не помогло
Если открываю 1000 файлов, потом закрываю 1000 файлов, делаю паузу 5 секунд, потом открываю следующую 1000, то на этой второй тысяче файлы начинают открываться медленнее.
Код:
#include <QCoreApplication>
#include<QFile>
#include<QDir>
#include<QTime>
#include<QElapsedTimer>
#include<QDebug>
const QString folderPath = "D:\\ForSend\\FolderSend3";
const QChar subdirSeparator = '\\';
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir dir(folderPath);
QStringList dirFiles = dir.entryList(QDir::Files|QDir::NoDotAndDotDot|QDir::Hidden);
int counter = 0;
QElapsedTimer timer;
for (QStringList::const_iterator it = dirFiles.begin(); it != dirFiles.end(); ++it) {
QString fullPath1 = folderPath + subdirSeparator + *it;
QFile f(fullPath1);
QTime t1 = QTime::currentTime();
f.open(QIODevice::ReadOnly);
QTime t2 = QTime::currentTime();
//f.close();
qDebug() << t1 << endl << t2 << endl << *it << counter;
counter++;
if(counter == 1000){
counter = 0;
timer.start();
while (timer.elapsed() < 5000) {
continue;
}
}
}
return a.exec();
}
Если перезапустить приложение, то 1000 файлов опять быстро открывает.
Как будто надо что-то почистить, обновить...
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4725
Re: Последовательное открытие большого количества файлов
«
Ответ #9 :
Октябрь 14, 2022, 17:29 »
может еще в однопоточности дело
а ты тестировал с реальной передачей по сети? а то тут только игрушечный код у тебя.
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
YvenTitan
Самовар
Offline
Сообщений: 174
Re: Последовательное открытие большого количества файлов
«
Ответ #10 :
Октябрь 17, 2022, 08:54 »
Тестировал, скорость выходит в разы меньше, чем при передаче одного большого файла. Я написал про передачу файлов, потому что мог возникнуть вопрос: "Зачем в реальных задачах открывать и закрывать тысячи фалов?"
Как предлагаешь тут многопоточность применить? Один поток открывает файл, а другой передает по сети?
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4725
Re: Последовательное открытие большого количества файлов
«
Ответ #11 :
Октябрь 17, 2022, 13:33 »
Цитировать
Тестировал, скорость выходит в разы меньше, чем при передаче одного большого файла
это ожидаемо
Цитировать
Как предлагаешь тут многопоточность применить? Один поток открывает файл, а другой передает по сети?
можно и так попробовать. можно сделать пул потоков, каждый из которых будет работать со своей пачкой файлов.
Цитировать
Одно из условий задания - передавать много маленьких файлов
а как само задание звучит? может можно придумать другой подход?
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
panAlexey
Гипер активный житель
Offline
Сообщений: 864
Акцио ЗАРПЛАТА!!!!! :(
Re: Последовательное открытие большого количества файлов
«
Ответ #12 :
Октябрь 17, 2022, 23:15 »
Попробуй раскопировать в папки по 500 файлов и оттуда отправлять.
дело явно в фс.
Записан
Win Xp SP-2, Qt4.3.4/MinGW.
http://trdm.1gb.ru/
YvenTitan
Самовар
Offline
Сообщений: 174
Re: Последовательное открытие большого количества файлов
«
Ответ #13 :
Октябрь 19, 2022, 17:12 »
Цитировать
можно и так попробовать. можно сделать пул потоков, каждый из которых будет работать со своей пачкой файлов.
В принципе это выход из ситуации: сделать пул из 10-20 потоков, которые только открывают файлы и посылают дескриптор в очередь другого потока, который вычитывает данные из файлов, посылает по сети и закрывает файлы. Технически не самое простое решение + непонятно, как поведет себя файловая система, если сразу 10 потоков начнут открывать файлы. Предположу, что задержки могут увеличиться с 30 мс. Тут пока не попробуешь, точно не скажешь
Цитировать
а как само задание звучит? может можно придумать другой подход?
Мне перефразировали так: "Написать передающую и приемную части программ, которые передают по сети файлы с высокой скоростью по заданному протоколу". 100 000 файлов - это крайний случай, который должна выполнять программа.
Цитировать
Попробуй раскопировать в папки по 500 файлов и оттуда отправлять.
Попробовал. Не помогло.
Еще попробовал под Линуксом запустить показанный вариант - все работает!
Было бы здорово понять, можно ли что-то сделать (как-то настроить) с файловой системой винды, чтобы не было задержек при открытии файлов
«
Последнее редактирование: Октябрь 19, 2022, 17:14 от YvenTitan
»
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4725
Re: Последовательное открытие большого количества файлов
«
Ответ #14 :
Октябрь 19, 2022, 18:56 »
Цитировать
Мне перефразировали так: "Написать передающую и приемную части программ, которые передают по сети файлы с высокой скоростью по заданному протоколу". 100 000 файлов - это крайний случай, который должна выполнять программа.
не вижу где тут запрет на сжатие файлов
Цитировать
Было бы здорово понять, можно ли что-то сделать (как-то настроить) с файловой системой винды, чтобы не было задержек при открытии файлов
можно попробовать RAM disk, раз файлы мелкие
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...