【问题标题】:How to read only part of a line on a big file?如何只读取大文件中一行的一部分?
【发布时间】:2021-03-04 08:26:45
【问题描述】:

我有一个 30GB 的日志文件要读取和处理, 在第一部分中,我需要找到一系列日期(我从最终用户那里获得),然后将它们全部打印出来。

所以对于第一部分,是否可以只读取每行的日期(前 20 个字符)而不是移动到下一行的开头,而不是读取整行?

C# 编码

【问题讨论】:

  • 无论哪种方式,您都必须经过整条生产线才能到达下一条生产线。这就是文本文件的读取方式。
  • 是的,所以文本文件只是文件中的一堆字符字节。它不包含所有行尾所在的字典。您需要阅读每一行以获取结尾以获取开始以获取范围....
  • 如何将文件指针初始化到文件的中间,然后使用带有该指针的二进制搜索来找到想要的日期?我还要继续前进吗?
  • 当然,发疯...
  • 我在猜测 op 的意思,像二进制搜索算法一样将文件一分为二,并从该偏移量中找到下一行的结尾。我喜欢这个主意。虽然这需要一些混乱。 Orrrrr,您可以使用更好的日志记录框架,自然地将结构化日志存储在数据库中并对其进行索引......有很多

标签: c# file pointers stream


【解决方案1】:

文本文件并不特殊,它们没有索引之类的东西来加快速度。您将需要阅读所有 30GB。如今,TBH 30GB 并不多。我曾在每天生成这么多日志的系统上工作过。有 $$$ 工具可以提供帮助,如果您经常需要查看这么多文本,它们会预先索引数据,但如果这是一次性的,那么类似:

while(!stream.EndOfStream)
{
     var line = stream.ReadLine();
     var dateTime = DateTime.Parse(line.SubString(20));
     if(dateTime >= start && <=end)
     { do something }
}

【讨论】:

  • 值得注意的是,对于现代 SSD,您可以使用相当大的缓冲区大小来显着提高文件流的性能,同时设置顺序标志也将获得少量收益
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2021-12-20
  • 2016-10-04
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多