200MB を超える大きなファイルがあります。ファイルは外部の CSV ファイルですが、残念ながら\r\n
、新しい行を定義するために使用されるように、ファイルを 1 行ずつ読み取ることはできません。
現在、私はこのアプローチを使用してすべての行を読んでいます:
var file = File.ReadAllText(filePath, Encoding.Default);
var lines = Regex.Split(file, @"\r\n");
for (int i = 0; i < lines.Length; i++)
{
string line = lines[i];
...
}
これを最適化するにはどうすればよいですか?225MB のファイルで ReadAllText を呼び出した後、プロセスは 1GB 以上の RAM を使用しています。私の場合、\r\n
パターンを使用してファイルを分割する必要がある場合、ストリーミング アプローチを使用することは可能ですか?
EDIT1 : File.ReadLinesとStreamReader
を使用したソリューションは、ファイル内の各行が 1 行として認識されるため、機能しません。\r\n
パターンを使用してファイルを分割する必要があります。私のコードを使用してファイルを読み取ると、758.371 行 (これは正しい) になりますが、通常の行数は 150 万を超えます。
解決
public static IEnumerable<string> ReadLines(string path)
{
const string delim = "\r\n";
using (StreamReader sr = new StreamReader(path))
{
StringBuilder sb = new StringBuilder();
while (!sr.EndOfStream)
{
for (int i = 0; i < delim.Length; i++)
{
Char c = (char)sr.Read();
sb.Append(c);
if (c != delim[i])
break;
if (i == delim.Length - 1)
{
sb.Remove(sb.Length - delim.Length, delim.Length);
yield return sb.ToString();
sb = new StringBuilder();
break;
}
}
}
if (sb.Length>0)
yield return sb.ToString();
}
}