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

Posted

技术标签:

【中文标题】使用 C# 从存储在 azure blob 存储中的 200gb 文本文件中读取一行【英文标题】:Read one line from 200gb text file which is stored on azure blob storage using C# 【发布时间】:2021-05-09 12:06:12 【问题描述】:

我在 azure blob storage 上有 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);

【问题讨论】:

200 gig 文本文件在你需要搜索的天蓝色块存储中......我觉得你需要重新考虑你的设计。 contents 我猜字符串是什么类型?您如何将 200gigs 存储在一个字符串中?你确定这是 200GB 而不是 200MB? 你试过用`StreamReader.ReadLine逐行阅读 内容是由行分隔的文本 但是如果你搜索的行是最后一行,你仍然需要下载 200gbs。下载此文件一次,将其拆分并存储回例如表存储或数据库中,可以在服务器上搜索的东西。现有的解决方案很糟糕,需要丢弃 【参考方案1】:

您需要流式传输文件并设置超时。我已经将流实现包装在 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,则需要删除所有等待和异步方法,只需使用带有 stream.ReadLine 的 for 循环 em>

【讨论】:

我建议只使用 一次:将令人讨厌的文本文件分解成碎片并创建一个体面的数据概念。

以上是关于使用 C# 从存储在 azure blob 存储中的 200gb 文本文件中读取一行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 从 azure blob 存储中检索 xml 文件

C# API - 提供从 Azure Blob 存储下载的文件

如何从 C# Core 中的 azure blob 存储中读取所有文件

如何使用 Object c# .NET Core 在 blob 存储 Azure 上创建 csv 文件?

如何从 azure blob 存储下载文件

从 Azure Blob 存储下载文件