【问题标题】:Fastest way to find text in large online text file在大型在线文本文件中查找文本的最快方法
【发布时间】:2016-08-27 08:37:49
【问题描述】:

有一个 url 只包含文本。

格式为

firstWord~:::~secondWord

目标是查找secondWord,然后查找Console.WriteLinefirstWord

如果我不得不猜测,我会说使用WebClient 将文本文件下载到string,然后使用regex 查找它。

问题是这个文件大约 1 GB,我不确定最快的方法是什么。

有什么想法吗?谢谢!

【问题讨论】:

  • 如果你想要速度,那么你肯定不想使用正则表达式
  • 也许您可以一次下载一些数据?假设您有一个读取直到找到新行的方法,然后它以您想要的方式处理该行文本。如果没有找到您的文本,请继续下载几个字节,直到找到下一个新行。
  • @VisualVincent 说得很好,但是如果假设文本一直位于 1 Gig 文件的底部,需要多长时间。
  • 这取决于您的网速、您的计算机规格以及您编写代码的方式。您可能希望在单独的线程/任务中执行此操作,因为您仍在下载整个 1 GB 文件,但一次只能下载几个字节。首先(即,如果您的字符串位于底部),很可能会更快地下载文件,但是您必须再次等待整个下载完成。
  • isn't it already going as fast as possible? - 唯一可以使已经完全速度优化的流程更快的方法是划分工作。这就是我们使用多线程的原因。

标签: c# string search


【解决方案1】:

下面是我能想到的最快的方法。这并不是说您不能在这里和那里刮掉一些蜱虫......很高兴看到其他反馈,看看我们是否可以进一步简化这一点。

// WebClient is very bulky with a lot of stuff we don't need.
// By dealing with the request, response and stream ourself we can get the string a bit faster.
WebRequest request = WebRequest.Create("http://www.UrlToDownloadStringFrom.com");
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(stream);

// the result should return "firstWord~:::~secondWord" as expected.
string result = streamReader.ReadToEnd();

// split the string apart whenever the string ~:::~ appears within it.
string[] resultSplit = result.Split(new string[] { "~:::~" }, StringSplitOptions.None);

// resultSplit[0] is firstWord, resultSplit[1] is second word
string secondWord = resultSplit[1]; 

【讨论】:

  • 如果HttpWebRequest 会快得多,为什么您的示例还使用WebClient,URL 将包含不止一次firstWord~:::~secondWord 迭代。它将包含大约 1 gig 该格式的文本,每一行都有不同的文本
  • 我读过上面的WebClient。我已将答案编辑得尽可能快。我不想在流阅读器中添加检查,因为我认为检查中间阅读将花费更长的时间而不是让它完成。但这只是我的假设,需要测试。
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 2010-11-17
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多