导入文件与streamReader.ReadBlock(缓冲)
本文关键字:缓冲 ReadBlock streamReader 文件 导入 | 更新日期: 2023-09-27 18:09:24
需要导入大量的文本文件并找到一些研究材料,特别是针对我的问题,我决定在这里发布解决方案。我相信它会帮助别人。
我的文件是300万以上的注册表。尝试逐行读取,使用StreamReader.ReadLine(),但这是不切实际的。此外,文件太大,无法在内存中加载。
解决方案是使用streamReader.ReadBlock()在内存中以块(缓冲区)的形式加载文件。
我遇到的困难是ReadBlock()逐字节读取,在一行中发生或获得另一半。然后下一个缓冲区,第一行是不完整的。为了纠正,我加载了一个字符串 (resto),并与下一个缓冲区的第一行(primeiraLinha)连接。
使用Split的另一个重要细节是,在大多数例子中,变量的第一次验证是在Trim()之后进行的,以消除空格。在这种情况下,我没有使用,因为它连接了第一行和第二行缓冲区。
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;
}
}
}
}
}
我有一个很大的帮助,从我的朋友训练,加布里埃尔古斯塔夫,解决这个问题。
如果有人对进一步提高性能有任何建议,或者提出任何意见,请尽管提。
c#有一个专门处理大文件的类:MemoryMappedFile。这很简单,我想可以帮助你。