[編集]
ログファイルの先頭をトリミングするためにこれをやっている場合、あなたはこのような何かを行うことによって、ファイル全体を読み込む避けることができます。
以来
// count the number of lines in the file
int count = 0;
using (var sr = new StreamReader("file.txt"))
{
while (sr.ReadLine() != null)
count++;
}
// skip first (LOG_MAX - count) lines
count = LOG_MAX - count;
using (var sr = new StreamReader("file.txt"))
using (var sw = new StreamWriter("output.txt"))
{
// skip several lines
while (count > 0 && sr.ReadLine() != null)
count--;
// continue copying
string line = "";
while (line = sr.ReadLine() != null)
sw.WriteLine(line);
}
まず第一に、はファイル全体を文字列配列(string[]
)にロードし、リストへのコピーは冗長です。
第2に、フードの下でダイナミックアレイを使用してList
が実装されていることを理解する必要があります。つまり、ファイル全体を格納できるようになるまで、CLRは複数の配列を割り当ててコピーする必要があります。このファイルはすでにディスク上にあるので、メモリのトランザクション速度とディスクデータの直接処理、またはそれを小さな単位で処理することが考えられます。
あなたは、少なくとも配列に残すようにしようと、メモリに完全にそれをロードする必要がある場合:
string[] lines = File.ReadAllLines("file.txt");
それは本当にList
にする必要がある場合は、負荷線一つずつ:
List<string> lines = new List<string>();
using (var sr = new StreamReader("file.txt"))
{
while (sr.Peek() >= 0)
lines.Add(sr.ReadLine());
}
注:List<T>
は、容量パラメータを受け取るコンストラクタを持っています。
List<string> lines = new List<string>(NUMBER_OF_LINES);
はさらに良いことに、「オンザフライ」のメモリとそれを処理中に、ファイル全体を保管することは避けてください:あなたは、事前に行数がわかっている場合は、事前に配列を事前に割り当てることにより、複数の配分を防ぐことができます
using (var sr = new StreamReader("file.txt"))
{
string line;
while (line = sr.ReadLine() != null)
{
// process the file line by line
}
}
'LogList'に' readonly'とマークしたときにエントリを追加するのは難しくありませんか? – Tim
これは、読み取り専用リストではなく参照を再割り当てできないことを意味します。 – Deleted
あなたのタイトルに "C#"を入れてはいけません。質問の内容について言えば、それはタグのためです。 –