ファイルからの読み取りが十分に速くありませんが、どのように高速化しますか?
-
03-07-2019 - |
質問
これは私がファイルを読む方法です:
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();
}
問題は非常に長いことです(.txtファイルは約2.5メガです)。 5分以上かかりました。より良い方法はありますか?
解決策
public static string readFile(string path)
{
return File.ReadAllText(path);
}
1秒未満で......)
解決
大丈夫なはずの恐ろしい変数名とusingステートメント(例外がある場合はファイルを閉じません)を残し、確かには5分はかかりません2.5メガグラムを読み取ります。
ファイルはどこにありますか?不安定なネットワーク共有にありますか?
ところで、あなたがしていることとFile.ReadAllTextを使用していることの唯一の違いは、改行を失っているということです。これは意図的ですか? ReadAllTextの所要時間はどのくらいですか?
他のヒント
S = SR.ReadLine();
while (S != null)
{
stringFromFile.Append(SR.ReadLine());
}
ここで注意すべきなのは、最初の ReadLine()
の後に S
が設定されることはないため、 S!= null
条件がトリガーされることはありませんwhileループに入ります。試してください:
S = SR.ReadLine();
while (S != null)
{
stringFromFile.Append(S = SR.ReadLine());
}
または他のコメントのいずれかを使用します。
改行を削除する必要がある場合は、string.Replace(Environment.NewLine、"")を使用します
return System.IO.File.ReadAllText(path);
Marcus Griepが正しい。無限ループがあるため、時間がかかります。コードをコピーして変更を加えたところ、2.4 Mのテキストファイルが1秒もかからずに読み取られました。
しかし、ファイルの最初の行を見逃すかもしれません。これを試してください。
S = SR.ReadLine();
while (S != null){
stringFromFile.Append(S);
S = SR.ReadLine();
}
一度にメモリ内の2.5 MB全体が必要ですか?
そうでない場合、私はあなたが必要とするもので作業しようとします。
代わりにSystem.IO.File.RealAllLinesを使用します。
http://msdn.microsoft.com /en-us/library/system.io.file.readalllines.aspx
別の方法として、文字数を推定し、文字数をStringBuilderのコンストラクターに渡すと、処理速度が向上するはずです。
これを試してみてください、もっと速くなるはずです:
var str = System.IO.File.ReadAllText(path);
return str.Replace(Environment.NewLine, "");
ところで:次回同様の状況になったら、メモリを事前に割り当ててみてください。これにより、使用する正確なデータ構造に関係なく、ランタイムが大幅に向上します。ほとんどのコンテナ( StringBuilder
)には、メモリを予約できるコンストラクタがあります。このようにして、読み取りプロセス中に時間のかからない再割り当てが必要になります。
たとえば、ファイルから StringBuilder
にデータを読み込む場合は、次のように記述できます。
var info = new FileInfo(path);
var sb = new StringBuilder((int)info.Length);
( System.IO.FileInfo.Length
は long
であるため、キャストが必要です。)
ReadAllTextは私にとって非常に良いソリューションでした。 3.000.000行のテキストファイルに次のコードを使用しましたが、すべての行を読み取るのに4〜5秒かかりました。
string fileContent = System.IO.File.ReadAllText(txtFilePath.Text)
string[] arr = fileContent.Split('\n');
ループと StringBuilder
は冗長な場合があります。使用してみてください
ReadToEnd 。
テキストファイルを最速で読むには、次のようなものを使用できます
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 "";
}
}
これがお役に立てば幸いです。詳細については、次のリンクをご覧ください。 テキストファイルを読む最も速い方法