C#用流读写大文件,已测试方案可行

  • binGe博客
  • C#
  • 2021-9-18 14:39:30
  • 人已阅读
简介有时候读取文件数据量特别大的时候,普通的File.ReadAllText已经不能满足需求了,这个时候需要使用其他方式来解决这个问题,如ReadLines或者读取流的模式
行不行,尝试再说

思路1:这个思路感觉还可以,ConsoleApp1.rar

Stopwatch watch = new Stopwatch();watch.Restart();
using (StreamWriter newFile = new StreamWriter(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\big4.txt"))
using (StreamReader reader = new StreamReader(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test.txt"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        newFile.WriteLine(line);
    }
}
watch.Stop();
Console.WriteLine($"StreamReader StreamWriter 程序运行花费的时间:{(double)watch.ElapsedMilliseconds / 1000:0.000} secs");

watch.Restart();
int length = 2048;
byte[] array = new byte[length];
int bytesRead = 0;
using (FileStream fileStream = new FileStream(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test.txt", FileMode.Open))
using (FileStream newFile = new FileStream(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test5.txt", FileMode.Create))
using (BufferedStream bufferedStream = new BufferedStream(fileStream))
{
    while ((bytesRead = bufferedStream.Read(array, 0, length)) > 0)
    {
        if (bytesRead == length)
            newFile.Write(array);
        else
            newFile.Write(array, 0, bytesRead);
    }
}
watch.Stop();
Console.WriteLine($"BufferedStream FileStream 程序运行花费的时间:{(double)watch.ElapsedMilliseconds / 1000:0.000} secs");

watch.Restart();
using (FileStream fileStream = new FileStream(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test.txt", FileMode.Open))
using (StreamWriter newFile = new StreamWriter(@"D:\gitPublic\NetFrameTest\NetFrameTest\NetCore\test6.txt"))
using (BufferedStream bufferedStream = new BufferedStream(fileStream))
using (StreamReader reader = new StreamReader(fileStream))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        newFile.WriteLine(line);
    }
}
watch.Stop();
Console.WriteLine($"StreamReader StreamWriter(结合BufferedStream) 程序运行花费的时间:{(double)watch.ElapsedMilliseconds / 1000:0.000} secs");

思路2:

现有一个超大TXT文件,内部以\t分格,每行244个值,一共250万行,大小1.9G,第一行是列名,现在要将每一行的数据读出来进行处理,如果一次性读进内存肯定是不行的。

目录

读第一行:

读后续行:

遍历方法

使用感受

参考:

读第一行:
 
 string headerLine = File.ReadLines(path).FirstOrDefault(); // Read the first row for headings
读后续行:
_filePath是文件路径

_currentLine是读过的行数

limit指定的是一次读多少行

_encoding指定编码为GBK或UTF-8

static private System.Text.Encoding _encoding = Encoding.GetEncoding("gb2312");//Encoding.UTF8; //Encoding.ASCII;

       public static IEnumerable<string>  readMultiLines(int limit = 100)
        {
            try
            {
                var lines = File.ReadLines(_filePath, _encoding).Skip(_currentLine).Take(limit);
                _currentLine += limit;
                return lines;
            }
            catch(Exception  ){
                return null;  
            }
        }
遍历方法
ReadLines返回的是一个IEnumerable<string>  类型,可以用iter进行遍历。

iter.Current直接获取每一行的字符串,不可以用iter.toString(),会很费时间。

   var lines = File.ReadLines(_filePath, _encoding).Skip(_currentLine).Take(bigStep);
   var iter = lines.GetEnumerator();
   int size = lines.Count<string>();
 
   while (iter.MoveNext())
   {
       string dataStr = iter.Current;
       fun(dataStr);         
                   
    } 
使用感受
每次读500行,在读取前100万行时感觉还非常快,但在后面感觉还是有一点的延时。不过应该满足需求了。
————————————————
版权声明:本文为CSDN博主「阿龙哥哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/v6543210/article/details/88825466 

文章评论

评论
  • 消灭零回复
Top