Название: Последовательное открытие большого количества файлов Отправлено: YvenTitan от Октябрь 13, 2022, 17:22 Здравствуйте
У меня задача передать по сети около 100 000 файлов размером от 100 килобайт до 1 мегабайта. Скорость важна. Проблема в том, что на открытие каждого файла уходит около 30 миллисекунд. При этом передача файла идет меньше 10 мс. Если файлов не 100 000, а 1500, то работает нормально. Если 2000, то медленно открывает. Тестовый код такой (тут не посылаю никуда файл): Код: #include <QCoreApplication> Операционная система: Windows 10. Замена QFile на FILE* в стиле С не меняет дело. Подскажите, пожалуйста, в чем может быть причина задержки при открытии файлов? Название: Re: Последовательное открытие большого количества файлов Отправлено: kambala от Октябрь 13, 2022, 22:46 в файловой системе и/или ОС
Название: Re: Последовательное открытие большого количества файлов Отправлено: YvenTitan от Октябрь 14, 2022, 09:35 Что можно сделать, чтобы избежать больших задержек при открытии файлов?
Название: Re: Последовательное открытие большого количества файлов Отправлено: kambala от Октябрь 14, 2022, 10:05 если надо просто передать столько файлов, проще сделать это в архиве (может быть в нескольких)
Название: Re: Последовательное открытие большого количества файлов Отправлено: YvenTitan от Октябрь 14, 2022, 10:21 Одно из условий задания - передавать много маленьких файлов
Может что-то с таблицей дескрипоров происходит (например, переполнение), но я не знаю, как проверить это гипотезу Название: Re: Последовательное открытие большого количества файлов Отправлено: kambala от Октябрь 14, 2022, 10:39 попробуй передавать пачками по паре тысяч. как только текущая пачка передалась, запускаешь следующую.
Название: Re: Последовательное открытие большого количества файлов Отправлено: YvenTitan от Октябрь 14, 2022, 10:49 Ты имеешь в виду, открыть сразу пару тысяч файлов, передать, закрыть; после этого опять открыть пару тысяч файлов, передать и закрыть?
Название: Re: Последовательное открытие большого количества файлов Отправлено: kambala от Октябрь 14, 2022, 12:17 ну примерно, да. можно еще небольшие задержки попробовать ставить между пачками.
Название: Re: Последовательное открытие большого количества файлов Отправлено: YvenTitan от Октябрь 14, 2022, 16:26 Не помогло :(
Если открываю 1000 файлов, потом закрываю 1000 файлов, делаю паузу 5 секунд, потом открываю следующую 1000, то на этой второй тысяче файлы начинают открываться медленнее. Код: #include <QCoreApplication> Если перезапустить приложение, то 1000 файлов опять быстро открывает. Как будто надо что-то почистить, обновить... Название: Re: Последовательное открытие большого количества файлов Отправлено: kambala от Октябрь 14, 2022, 17:29 может еще в однопоточности дело
а ты тестировал с реальной передачей по сети? а то тут только игрушечный код у тебя. Название: Re: Последовательное открытие большого количества файлов Отправлено: YvenTitan от Октябрь 17, 2022, 08:54 Тестировал, скорость выходит в разы меньше, чем при передаче одного большого файла. Я написал про передачу файлов, потому что мог возникнуть вопрос: "Зачем в реальных задачах открывать и закрывать тысячи фалов?"
Как предлагаешь тут многопоточность применить? Один поток открывает файл, а другой передает по сети? Название: Re: Последовательное открытие большого количества файлов Отправлено: kambala от Октябрь 17, 2022, 13:33 Цитировать Тестировал, скорость выходит в разы меньше, чем при передаче одного большого файла это ожидаемо :)Цитировать Как предлагаешь тут многопоточность применить? Один поток открывает файл, а другой передает по сети? можно и так попробовать. можно сделать пул потоков, каждый из которых будет работать со своей пачкой файлов.Цитировать Одно из условий задания - передавать много маленьких файлов а как само задание звучит? может можно придумать другой подход?Название: Re: Последовательное открытие большого количества файлов Отправлено: panAlexey от Октябрь 17, 2022, 23:15 Попробуй раскопировать в папки по 500 файлов и оттуда отправлять.
дело явно в фс. Название: Re: Последовательное открытие большого количества файлов Отправлено: YvenTitan от Октябрь 19, 2022, 17:12 Цитировать можно и так попробовать. можно сделать пул потоков, каждый из которых будет работать со своей пачкой файлов. В принципе это выход из ситуации: сделать пул из 10-20 потоков, которые только открывают файлы и посылают дескриптор в очередь другого потока, который вычитывает данные из файлов, посылает по сети и закрывает файлы. Технически не самое простое решение + непонятно, как поведет себя файловая система, если сразу 10 потоков начнут открывать файлы. Предположу, что задержки могут увеличиться с 30 мс. Тут пока не попробуешь, точно не скажешьЦитировать а как само задание звучит? может можно придумать другой подход? Мне перефразировали так: "Написать передающую и приемную части программ, которые передают по сети файлы с высокой скоростью по заданному протоколу". 100 000 файлов - это крайний случай, который должна выполнять программа.Цитировать Попробуй раскопировать в папки по 500 файлов и оттуда отправлять. Попробовал. Не помогло.Еще попробовал под Линуксом запустить показанный вариант - все работает! Было бы здорово понять, можно ли что-то сделать (как-то настроить) с файловой системой винды, чтобы не было задержек при открытии файлов Название: Re: Последовательное открытие большого количества файлов Отправлено: kambala от Октябрь 19, 2022, 18:56 Цитировать Мне перефразировали так: "Написать передающую и приемную части программ, которые передают по сети файлы с высокой скоростью по заданному протоколу". 100 000 файлов - это крайний случай, который должна выполнять программа. не вижу где тут запрет на сжатие файловЦитировать Было бы здорово понять, можно ли что-то сделать (как-то настроить) с файловой системой винды, чтобы не было задержек при открытии файлов можно попробовать RAM disk, раз файлы мелкие |