많은 수의 텍스트 파일을 가져 와서 특히 내 문제의 연구 자료를 찾으려면 여기에 해결책을 게시하기로 결정했습니다. 나는 그것이 다른 누군가를 도울 것이라고 믿는다.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;
}
}
}
}
}
저는이 문제의 해결책 인 친구 가브리엘 구스타프 (Gabriel Gustaf)의 도움을 많이 받았습니다.
성능을 향상 시키거나 의견을 나눌 제안이 있으시면 언제든지 알려주십시오.
인코딩에주의하십시오. – SLaks