使用 C# 从存储在 azure blob 存储中的 200gb 文本文件中读取一行
Read one line from 200gb text file which is stored on azure blob storage using C#
我在 Azure Blob 存储上有 200 GB 的文本文件。我想在文本中搜索,然后需要下载匹配行而不是整个 200 GB 文件,然后 select 该行。
我已经通过下载完整文件然后搜索和 selecting 用 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);
您需要流式传输文件并设置超时。我已经将流实现包装在 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 循环
我在 Azure Blob 存储上有 200 GB 的文本文件。我想在文本中搜索,然后需要下载匹配行而不是整个 200 GB 文件,然后 select 该行。
我已经通过下载完整文件然后搜索和 selecting 用 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);
您需要流式传输文件并设置超时。我已经将流实现包装在 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