gpt4 book ai didi

c# - 加快从 StreamReader 中搜索/读取的速度

转载 作者:行者123 更新时间:2023-11-30 22:06:10 28 4
gpt4 key购买 nike

我正在尝试下载 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”(用破折号分隔的第二个或最后一个子字符串,因为这是我所掌握的关于该 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 方法——我希望它是数据传输。这看起来已经相当有效,但我会做出三处更改:

  • 利用 ReadLine() 在输入结束时返回 null 而不是使用 EndOfStream
  • 使用 ReadLine() 被声明为返回 string 的事实 - 您不需要调用 ToString。 (这不会影响你的表现,但它很难看。)
  • 对响应和响应流使用using 语句。你可能没问题,因为你有一个用于读者的 using 语句,但你应该至少有一个用于响应本身。

所以:

string line;
while (!isDownloaded && (line = reader.ReadLine()) != null)
{
if (line.Contains(target))
{
isDownloaded = true;
}
}

要验证问题确实是 网络 而不是 Contains 调用,请尝试将两者分开(仅用于诊断目的;您不想在现实中这样做,因为您希望能够在找到文件后立即停止):

  • 获取所有文件名,并将它们存储在文件中(或内存中)
  • 搜索文件名

计算两个步骤的时间 - 如果您没有发现第一步花费了几乎所有时间,我会感到惊讶。使用 Contains 搜索 82000 个字符串应该非常非常快。

关于c# - 加快从 StreamReader 中搜索/读取的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23799051/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com