2017-12-21 18 views
0

いくつかのテスト中に、私たちのチームの1人がFTP経由でディレクトリにアクセスしようとしているタイムアウトを報告しました。原因はコード内のバグで、何百万もの小さなファイルが作成されていました。FTPはページングをサポートしていますか?

タイムアウトの理由は、要求がディレクトリの内容を表示するよう要求し、すべてのファイルで1つの応答を待つことです。

代わりに、サーバーが見つかった時点で結果を返すようになった場合(yield returnreturn)、タイムアウトが発生します。同様に、ページされたデータを返すオプションがあれば、回避策が得られるかもしれません。

FTPがrequest-responseであるため、request-response-response-...ではなく、yield returnのシナリオは実現できません。しかし、何らかの形式のページングが可能性があります。つまり、ページングは​​何らかの形式のソートを意味するため、これは解決策ではないでしょう。それ自体がファイル数のオーバーヘッドスケーリングにつながります。

注意:これは好奇心からの質問です。問題を解決するために単にディレクトリ(https://stackoverflow.com/a/6208144/361842)をパージしたので、実際の問題は解決されています。しかし、フィードの結果を元に戻すオプションがある場合、フォルダ内のアイテムの数が潜在的な問題でなくなります(返される前に結果を並べ替え/フィルタリングしない限り)。 FileZilla Serverと.Netクライアント(System.Net.FtpWebRequest)を使用しています。これは理論的なものなので、私たちの実装に固有のものよりも一般的な答えに興味があります。

答えて

2

FTPには、明示的なページングのサポートがありません。 FTPプロトコルは、あなたが記述した問題には関係ありません。ディレクトリリストの場合、新しいTCP接続が開かれ、その接続の最初のバイトから最後のバイトまでのすべてがディレクトリリストとみなされます。

したがって、サーバーはディレクトリのリストを自由にストリーミングすることができます。ただし、好きなときにはいつでもクライアントから受信したデータを自由に表示することができます。サーバーは、必要なときにディレクトリリストのいくつかを送り返し、少し待ってから、さらにいくつかのエントリを送信することができます。クライアントは、到着時にディレクトリリストを自由に表示したり、応答が受信される。

しかし、FTPサーバーは通常、ファイルを一覧表示するためにOS APIによってバインドされることに注意してください。 OSによっては、ディレクトリ内のファイルを一覧表示するためにAPIが呼び出すファイルシステムなどは、小さなファイルが多数あるディレクトリでは非常に長い時間がかかり、基本的にすべてのリストをFTPサーバーに返すことができます。

関連する問題