Leitura de arquivo não rápido o suficiente, como eu iria acelerá-lo?
-
03-07-2019 - |
Pergunta
Esta é a maneira que eu ler o arquivo:
public static string readFile(string path)
{
StringBuilder stringFromFile = new StringBuilder();
StreamReader SR;
string S;
SR = File.OpenText(path);
S = SR.ReadLine();
while (S != null)
{
stringFromFile.Append(SR.ReadLine());
}
SR.Close();
return stringFromFile.ToString();
}
O problema é tão longa (o arquivo .txt é de cerca de 2,5 megas). Levou ao longo de 5 minutos. Existe uma maneira melhor?
Solução tomado
public static string readFile(string path)
{
return File.ReadAllText(path);
}
Levou menos de 1 segundo ...:)
Solução
Deixando de lado os nomes de variáveis ??horríveis e a falta de uma instrução using (você não fechar o arquivo se existem exceções) que deve estar bem, e certamente não deve demorar 5 minutos para ler 2,5 megas.
Onde é que o arquivo vivo? É em um compartilhamento de rede esquisito?
A propósito, a única diferença entre o que você está fazendo e usando File.ReadAllText é que você está quebras de linha perdedora. É este deliberada? Quanto tempo faz ReadAllText take?
Outras dicas
S = SR.ReadLine();
while (S != null)
{
stringFromFile.Append(SR.ReadLine());
}
De nota aqui, S
nunca é definido depois que ReadLine()
inicial, de modo que a condição S != null
nunca ativa se você digitar o loop while. Tente:
S = SR.ReadLine();
while (S != null)
{
stringFromFile.Append(S = SR.ReadLine());
}
ou o uso de um dos outros comentários.
Se você precisa remover novas linhas, o uso String.Replace (Environment.NewLine, "")
return System.IO.File.ReadAllText(path);
Marcus Griep tem direito. TI está demorando tanto porque você tem um loop infinito. copiado o código e fez suas mudanças e ler um arquivo de texto 2,4 M em menos de um segundo.
mas eu acho que você pode perder a primeira linha do arquivo. Tente isto.
S = SR.ReadLine();
while (S != null){
stringFromFile.Append(S);
S = SR.ReadLine();
}
Você precisa de toda a 2,5 Mb na memória de uma vez?
Se não, eu iria tentar trabalhar com o que você precisa.
Use System.IO.File.RealAllLines vez.
http://msdn.microsoft.com /en-us/library/system.io.file.readalllines.aspx
Como alternativa, estimando a contagem de caracteres e passar isso para o construtor de StringBuilder como a capacidade deve acelerá-lo.
Tente isso, deve ser muito mais rápido:
var str = System.IO.File.ReadAllText(path);
return str.Replace(Environment.NewLine, "");
A propósito: Da próxima vez que você está em uma situação semelhante, tente memória pré-alocação. Isso melhora runtime drasticamente, independentemente das estruturas de dados exatas que você usa. A maioria dos recipientes (StringBuilder
também) ter um construtor que lhe permitem memória de reserva. Desta forma, menos realocações demoradas são necessárias durante o processo de leitura.
Por exemplo, você poderia escrever o seguinte, se você quiser ler dados de um arquivo em um StringBuilder
:
var info = new FileInfo(path);
var sb = new StringBuilder((int)info.Length);
(CAST necessário porque System.IO.FileInfo.Length
é long
.)
ReadAllText foi uma solução muito boa para mim. Eu costumava seguinte código para o arquivo de texto 3.000.000 fila e levou 4-5 segundos para ler todas as linhas.
string fileContent = System.IO.File.ReadAllText(txtFilePath.Text)
string[] arr = fileContent.Split('\n');
O loop e StringBuilder
pode ser redundante; tente usar
ReadToEnd .
Para ler um arquivo de texto mais rápido você pode usar algo como isto
public static string ReadFileAndFetchStringInSingleLine(string file)
{
StringBuilder sb;
try
{
sb = new StringBuilder();
using (FileStream fs = File.Open(file, FileMode.Open))
{
using (BufferedStream bs = new BufferedStream(fs))
{
using (StreamReader sr = new StreamReader(bs))
{
string str;
while ((str = sr.ReadLine()) != null)
{
sb.Append(str);
}
}
}
}
return sb.ToString();
}
catch (Exception ex)
{
return "";
}
}
Espero que isso irá ajudá-lo. e para mais informações, visite o seguinte link- maneira de ler arquivos mais rápidos texto