2013-04-16 114 views
2

需要导入大量文本文件并找到一些研究材料,特别是对于我的问题,我决定在此处发布解决方案。我相信它会帮助别人。用streamReader.ReadBlock(缓冲区)导入文件

我的档案是3,000,000注册。试图逐行阅读,StreamReader.ReadLine(),但它是不切实际的。而且,这些文件太大而无法加载到内存中。

解决方案是使用streamReader.ReadBlock()以块(缓冲区)的形式加载内存中的文件。

我遇到的困难是ReadBlock()逐字节读取,发生在一行中或得到另一半。然后第一行的下一个缓冲区不完整。为了更正,我加载了一个字符串resto),并与下一个缓冲区的第一行(primeiraLinha)连接。

在使用拆分,在大多数实施例中的变量的第一验证后跟修剪()以消除空间另一个重要的细节。在这种情况下,我不使用,因为它加入了第一行和第二行缓冲区。

using System; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main() 
     { 
      const string arquivo = "Arquivo1.txt"; 
      using (var streamReader = new StreamReader(arquivo)) 
      { 
       int deslocamento = 1000; 
       int pStart = 0; // buffer starting position 
       int pEnd = deslocamento; // buffer end position 
       string resto = ""; 
       for (int i = pStart; i < int.MaxValue; i += pStart) 
       { 
        string primeiraLinha; 
        char[] buffer = new char[pEnd-pStart]; 
        streamReader.ReadBlock(buffer, 0, buffer.Length); 
        var bufferString = new String(buffer); 
        string[] bufferSplit = null; 
        bufferSplit = bufferString.Split(new char[] { '\n' }); 
        foreach (var bs in bufferSplit) 
        { 
         if (bs != "") 
         { 
          if (resto != "") 
          { 
           primeiraLinha = resto + bs; 
           Console.WriteLine(primeiraLinha); 
           resto = ""; 
          } 
          else 
          { 
           if (bs.Contains('\r')) 
           { 
            Console.WriteLine(bs); 
           } 
           else 
           { 
            resto = bs; 
           } 
          } 
         } 
        } 
        Console.ReadLine(); 
        // Moves pointers 
        pStart = pEnd; 
        pEnd += deslocamento; 
        if (bufferString == null) 
         break; 
       } 
      } 
     } 
    } 
} 

我从我的朋友培训加布里埃尔古斯塔夫,解决这个问题有很大的帮助。

如果任何人有任何建议,以进一步提高性能,或发表任何意见,请随时取消。

+0

谨防编码。 – SLaks

回答

0

C#有一个设计类来处理大文件:MemoryMappedFile。这很简单,我认为可以帮助你。