Мне нужно загрузить несколько файлов через FTP в java. Для этого я написал код с помощью FTPClient, который загружает файлы один за другим. Мне нужно взять файлы с сервера и загрузить в другую сеть. После того, как я написал код, я обнаружил, что загрузка каждого файла занимает больше времени, поскольку размер файла огромен (более 10 ГБ). Я решил сделать процесс многопоточным, то есть запускать несколько файлов одновременно. Может ли кто-нибудь помочь мне написать FTP в многопоточной среде. Хотя я чувствую, что многопоточность не поможет, поскольку пропускная способность сети останется прежней и будет разделена между несколькими потоками, что снова приведет к медленной загрузке. Пожалуйста, предложите !!




Вам нужно сначала проверить разные вещи:
Если сервер ограничивает скорость передачи для одного файла порогом ниже его максимальной скорости передачи, вы можете получить некоторые преимущества, используя многопоточность (например, с ограничением 10 Кб / с на соединение и максимальной загрузкой 100 Кбайт. / s, теоретически можно иметь 10 загрузок параллельно). В противном случае многопоточность вам не поможет.
Кроме того, если ваша загрузка перегружена (вся ваша пропускная способность заполнена одной загрузкой или пропускная способность сервера превышает вашу загрузку), многопоточность вам не поможет.
Если многопоточность будет полезна, просто создайте новое соединение для каждого файла и поместите его в отдельный поток.
I feel that multithreading won't help as bandwidth of the network would remain same and would be divided among multiple threads and leading to slow download again.
Это вполне могло быть правдой. Действительно, если у вас слишком много потоков, пытающихся загрузить файлы одновременно, вы, скорее всего, либо перегрузите FTP-сервер, либо вызовете перегрузку сети. Оба могут привести к чистому снижаться в общей скорости передачи данных.
Решение состоит в том, чтобы использовать ограниченный пул потоков для потоков загрузки и настроить размер пула.
Также рекомендуется повторно использовать соединения, где это возможно, поскольку создание соединения и аутентификация пользователя требуют времени ... и ресурсов ЦП на обоих концах.
Спасибо за предложение @Stephen C !! ограниченный пул потоков для меня ново .. Не могли бы вы дать ссылку на то же самое? Кроме того, не уверен в настройке размера пула.
1) Самый простой способ - использовать ExecutorService; см. документацию Executors javadoc. 2) Отрегулируйте, измерьте, повторите.
Спасибо за предложение! Говоря о скорости загрузки - я мог видеть, как мой файл загружался в сеть со скоростью 10 Кб / с для одного файла, что заняло около 45 минут, чтобы загрузить файл 8 ГБ. Поэтому, когда у меня есть 5 файлов размером более 10 ГБ и я запускаю их параллельно, мне интересно, как он отреагирует. Хотя ручная загрузка занимала немного меньше времени, и мы хотели автоматизировать это с помощью java !! Хотя не уверен, как сервер может ограничить файл пороговым значением, когда у нас работает несколько файлов.