从使用 C# 存储在 azure blob 存储上的 200gb 文本文件中读取一行

时间:2021-02-05 06:04:35

标签: c# .net azure c#-4.0 azure-blob-storage

我在 azure blob 存储上有 200 GB 的文本文件。我想在文本中搜索然后匹配的行需要下载而不是整个 200 gb 文件,然后选择该行。

我已经通过下载完整文件然后搜索和选择在 c# 中编写了代码,但它花费了太多时间,然后因超时错误而失败。

var content ="" ////Downloading whole text from azure blob storage
 StringReader strReader = new StringReader(contents);
 var searchedLines1 = contents.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).
            Select((text, index) => new { text, lineNumber = index + 1 })
                       .Where(x => x.text.Contains("TYLER15727@YAHOO.COM") || x.lineNumber == 1);

1 个答案:

答案 0 :(得分:2)

您需要流式传输文件并设置超时。我已经将流实现包装在 IAsyncEnumerable 中,这是完全不必要的......但为什么不

给定

public static async IAsyncEnumerable<string> Read(StreamReader stream)
{
   while(!stream.EndOfStream)
      yield return await stream.ReadLineAsync();
}

使用

var blobClient = new BlobClient( ... , new BlobClientOptions()
{
   Transport = new HttpClientTransport(new HttpClient {Timeout = Timeout.InfiniteTimeSpan}),
   Retry = {NetworkTimeout = Timeout.InfiniteTimeSpan}
});

await using var stream = await blobClient.OpenReadAsync();
using var reader = new StreamReader(stream);

await foreach (var line in Read(reader))
   if (line.Contains("bob"))
   {
      Console.WriteLine("Yehaa");
      // exit or what ever
   }

免责声明:完全未经测试

注意:如果您使用的是 C#4,您将需要删除所有的 awaits 和 async 方法,并且只需使用带有 stream.ReadLine 的 for 循环