2016-05-27 4 views
2

Я загружаю 4000 ZIP-архивов размером 85 КБ каждого из них, используя Linux-сервер, используя SFTP в приложении C# WPF. Весь этот процесс занимает 30 минут.Передача большого количества файлов с использованием SFTP происходит медленно в C#

Есть ли способ ускорить загрузку с помощью SFTP?

Я использую WinSCP сборки .NET:
https://winscp.net/eng/docs/library

Я также использовал Чилкэт ранее.

Вот мой код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using WinSCP; 
namespace SFTP_Demo 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      string line; 
      SessionOptions sessionoptions = new SessionOptions() 
      { 
       Protocol = WinSCP.Protocol.Sftp, 
       HostName = "172.168.1.7", 
       PortNumber = 22, 
       UserName = "lduser", 
       Password = "lduser", 
       GiveUpSecurityAndAcceptAnySshHostKey = true 
      }; 
      using (Session session = new Session()) 
      { 
       session.Open(sessionoptions); 
       TransferOptions transferOptions = new TransferOptions(); 
       transferOptions.TransferMode = TransferMode.Binary; 
       TransferOperationResult transferResult; 
       System.IO.StreamReader file = new System.IO.StreamReader(txtFile.Text); 
       while ((line = file.ReadLine()) != null) 
       { 
        transferResult = session.PutFiles(@"D:\Test\signature\ldoutput\"+line, "/SFTP/", false, transferOptions); 
        transferResult.Check(); 
        counter++; 
        strbldr = strbldr.AppendLine(string.Format("{0} Upload of {1} succeeded", counter + 1.ToString(), line)); 
       } 
      } 
     } 
    } 
} 
+4

Как насчет того, чтобы застегнуть их все в один, передать, а затем распаковать на сервере? – Evk

+0

@ Evk Я пробовал это, и он занимает 3 минуты только для передачи этих файлов, но как можно распаковать файлы, расположенные над сервером с моего локального компьютера. – dhiraj

+1

Если у вас есть доступ к ssh, вы можете сделать это, используя, например, https: // sshnet.codeplex.com/ library (или любой другой). Если у вас нет доступа к ssh или вы не хотите его использовать, возможно, ваш код может быть улучшен, но не уверен. Но сначала проверьте простые параметры. – Evk

ответ

0

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

Что вы можете сделать, чтобы распараллелить передачу.

Соберите список файлов, используя Session.ListDirectory (или Session.EnumerateRemoteFiles, если вам нужна рекурсия) и разделите список на партии, передавая их в отдельный поток.

Для сценария PowerShell есть пример. Нетрудно переопределить код на C#.

Automating download in parallel connections over SFTP/FTP protocol.