0

[NetSupport、Radmin、PcAnyWhere ..] などのほとんどすべてのファイル転送ソフトウェアと、アプリケーションで使用したさまざまなコードを使用すると、1kb 未満の小さなサイズのファイルを大量に送信すると、転送速度が遅くなります。大量のファイル。

たとえば、LAN (イーサネット CAT5 ケーブル) で 1 つのファイル、たとえばビデオを送信すると、転送速度は 2MB から 9MB です
が、多数のファイルを含むゲームのフォルダーを送信すると、転送速度は約 300kb になります。 800キロバイト

ファイルの送信方法が原因だと思います:

  • ファイル情報 [file_path,file_Size] を送信します。
  • ファイルバイトを送信 [ファイルの終わりまでループ]。
  • 転送を終了 [完全に受信したことを確認]。

    しかし、ネットワーク上の共有フォルダで 通常のウィンドウの[コピー&ペースト]を使用すると、フォルダの送信の転送速度は常に単一のファイルを送信するのと同じように高速です。
    [WCF サービス c# 4.0] を使用して、LAN で利用可能な最大速度を使用するファイル転送アプリケーションを開発しようとしています。次のように考えています。

    Get all files from the folder.
    if(FileSize<1 MB)
    {
        Create additional thread to send;
        SendFile(FilePath);
    }
    else
    {
        Wait for the large file to be sent. // fileSize>1MB
    }
    
    void SendFile(string path)  // a regular single file send.
    {
        SendFileInfo;
        Open Socket and wait for server application to connect;
        SendFileBytes;
        Dispose;
    }
    

    しかし、ファイル転送に複数のソケットを使用することについて混乱しています。これは、より多くのポートとより多くの時間を使用するためです (リッスンと受け入れの遅延)。

    それでそれをするのは良い考えですか?
    それが可能かどうか、それを行う方法、これを意味する tcp よりも優れたプロトコルについての説明が必要です。
    前もって感謝します。

  • 4

    2 に答える 2

    3

    100%のLAN速度の使用を達成することは決してないことに注意する必要があります-私はあなたがそれを望んでいないことを願っています-そこにはあまりにも多くの要因があります。

    あなたのコメントにも応えて、あなたはウィンドウよりもベアメタルからはるかに離れているので、OSがファイルを転送するために使用するのと同じレベルに到達することはできません。Windowsでのファイルのコピーは、ドライバー自体の1、2層上にあると思います(おそらくファイルシステムドライバー内でも)。WCFサービスでは、はるかに遠くにあります。

    最も簡単な方法は、複数のファイルをアーカイブにパッケージ化して送信し、受信側でパッケージ全体をターゲットフォルダーに解凍することです。確かに、これらのファイルの一部はすでに圧縮されている可能性があるため、メリットはありませんが、一般的には大幅な改善が見られるはずです。ディレクトリ構造を保持できる堅固な圧縮については、SharpZipLibの使用を検討します

    圧縮をインテリジェントに使用するシステム(おそらく中レベルでCPU使用率が低いが、「圧縮可能な」ファイルでうまく機能する)は、OSのコピーに匹敵するか、それよりも優れている可能性があります。フォールトトレランスには絶望的であるため、Windowsはこの方法を使用しません。OSでは、ファイルの途中で転送を停止しても、成功したファイルはそのまま残ります。転送自体が圧縮されて中断された場合、すべてが失われ、再度開始する必要があります。

    それを超えて、あなたは次のことを考えることができます:

    拡張機能を試す前に、まずデフォルトで圧縮を使用して動作させます。場合によっては(サイズ/ファイル数によって異なります)、フォルダ全体を圧縮して、一度に送信できる場合もあります。ただし、特定のサイズを超えると、時間がかかりすぎる可能性があるため、一連の小さなzipを作成することをお勧めします。

    圧縮ファイルは、受信時にディスク上の一時的な場所に書き込みます。すべてをメモリにバッファリングしないでください。ファイルをターゲットフォルダに解凍したら、ファイルを削除します。

    特定のファイルタイプを「裸」、つまり非圧縮で送信できるものとしてマークする機能を追加することを検討してください。そうすれば、圧縮プロセスから.zip、avisなどのファイルを除外できます。とは言うものの、100万個の1kb zipファイルを含むフォルダーは、1つのアーカイブにパックすることで明らかにメリットがあります。したがって、そのファイルが圧縮フォルダー(またはファイル)にパックされる最小サイズを設定できるようにしてください。フォルダ自体のディスク上のカウント/サイズの比率-サブフォルダを含む)。

    このアドバイスを超えて、最良の結果を得るにはいろいろと試してみる必要があります。

    于 2012-04-16T13:21:40.933 に答える
    0

    おそらく、簡単な解決策は、すべてのファイルを 1 つの大きなストリームにまとめて (圧縮するなどして、高速化するために追加するだけです)、この 1 つのストリームを送信することです。これにより速度が向上しますが、両方のデバイスで CPU をいくらか消費するため、ストリーム内のすべてのファイルを分離する方法をお勧めします。

    しかし、より多くのポートを使用することは、衝突する異なるストリームが増えるため、速度が低下するため、不利になるだけです。

    于 2012-04-16T12:57:26.790 に答える