C# を使用して、約 120 MB のプレーンテキスト CSV ファイルを読み込んでいます。最初は行ごとに読み取って解析を行いましたが、最近、ファイルの内容全体を最初にメモリに読み取る方が数倍高速であることがわかりました。CSV には引用符の中にコンマが埋め込まれているため、解析はすでに非常に低速です。つまり、正規表現の分割を使用する必要があります。これは、確実に機能することがわかった唯一のものです。
string[] fields = Regex.Split(line,
@",(?!(?<=(?:^|,)\s*\x22(?:[^\x22]|\x22\x22|\\\x22)*,)
(?:[^\x22]|\x22\x22|\\\x22)*\x22\s*(?:,|$))");
// from http://regexlib.com/REDetails.aspx?regexp_id=621
内容全体をメモリに読み取った後に解析を行うために、改行文字で文字列分割を行い、各行を含む配列を取得します。ただし、120 MB のファイルでこれを行うと、System.OutOfMemoryException
. コンピューターに 4 GB の RAM が搭載されているのに、メモリがすぐに不足してしまうのはなぜですか? 複雑な CSV をすばやく解析するより良い方法はありますか?