FTPサーバーに存在するファイル名のリストをダウンロードしようとしています。すべての名前を取得したら、StreamReaderオブジェクトを使用してすべてのファイル名を検索し、そこに存在するファイルに含まれるサブストリングの存在を確認します。 ftp。
たとえば、ファイル名が次のような場合
0000730970-0633788104-20140422073022-0633788104.PDF
0000730970-0633789720-20140422101011-0633789720.PDF
0000730970-0633798535-20140425075011-0633798535.PDF
0000730970-0633798536-20140425075011-0633798536.PDF
0000730970-0633804266-20140428124147-0633804266.PDF
0000730970-0633805880-20140429065011-0633805880.PDF
「0633798535」を検索します(ダッシュで区切られた2番目または最後の部分文字列。FTPに存在するファイルに関する情報はこれだけなので、完全なファイル名はわかりません)。これを行うために使用している以下のコード
try{
browseRequest = (FtpWebRequest)FtpWebRequest.Create(ftpAddress);
browseRequest.Credentials = new NetworkCredential(username, password);
browseRequest.UsePassive = true;
browseRequest.UseBinary = true;
browseRequest.KeepAlive = true;
browseRequest.Method = WebRequestMethods.Ftp.ListDirectory;
response = (FtpWebResponse)browseRequest.GetResponse();
responseStream = response.GetResponseStream();
if (responseStream != null)
{
using (StreamReader reader = new StreamReader(responseStream))
{
while (!reader.EndOfStream && !isDownloaded)
{
string fileName = reader.ReadLine().ToString();
if (fileName.Contains(subStringToBeFind)) //search for the first encounter
{
//download the file
isDownloaded = true; //initially false
}
}
}
}
}
ここでは、シーケンシャル検索を使用してファイル名を見つけています。しかし、問題は、ファイルの量が多いと検索が遅くなることです。たとえば、82000のファイル名の場合、最後のファイルを検索する場合、検索に2分ほどかかります。このため、アプリケーションは低速です。だから、私は検索を加速するために助けが必要です。検索時間を改善するためにバイナリ検索または他の何かを使用する方法はありますか?
バイナリ検索を使用できるのは、すでにすべてのデータがある場合(および、データがソートされている場合、ここにあるように見える場合)のみです。ここでの方法はボトルネックではないのではないかと強く思いContains
ます。データ転送であると思います。私は3つの変更を加えますが、それはすでにかなり効率的であるように見えます。
ReadLine()
戻るという事実を使用しますnull
EndOfStream
ReadLine()
戻るように宣言されているファクトを使用しstring
ます-を呼び出す必要はありませんToString
。(これはパフォーマンスを損なうことはありませんが、醜いです。)using
応答と応答ストリームにステートメントを使用します。using
読者のためのステートメントがあるので大丈夫かもしれませんが、応答自体のために少なくとも1つは必要です。そう:
string line;
while (!isDownloaded && (line = reader.ReadLine()) != null)
{
if (line.Contains(target))
{
isDownloaded = true;
}
}
呼び出しではなくネットワークが本当に問題であることを検証するには、Contains
2つを分離してみてください(診断目的のためだけです。実際にはこれを実行したくないので、すぐに停止できるようにしたいからです。ファイルが見つかりました):
両方のステップの時間を計る-最初のステップがほとんど常にかかっていることに気づかなかったら、私は驚かれることでしょう。を使用して82000文字列を検索するContains
と、非常に高速になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加