解凍するためにftpからダウンロードした大きなgzipファイル(約10MB〜200MB)がたくさんあります。
そこで、グーグルでgzip解凍の解決策を見つけようとしました。
static byte[] Decompress(byte[] gzip)
{
using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
{
const int size = 4096;
byte[] buffer = new byte[size];
using (MemoryStream memory = new MemoryStream())
{
int count = 0;
do
{
count = stream.Read(buffer, 0, size);
if (count > 0)
{
memory.Write(buffer, 0, count);
}
}
while (count > 0);
return memory.ToArray();
}
}
}
50mb未満のファイルではうまく機能しますが、50mbを超える入力を行うと、システムのメモリ不足の例外が発生します。最後の位置と例外前のメモリの長さは134217728です。物理メモリとは関係がないと思います。32ビットを使用しているため、2GBを超えるオブジェクトを使用できないことを理解しています。
また、ファイルを解凍した後にデータを処理する必要があります。ここでメモリストリームが最善のアプローチであるかどうかはわかりませんが、ファイルに書き込んでからファイルを再度読み取るのはあまり好きではありません。
私の質問
- System.OutMemoryExceptionが発生したのはなぜですか?
- gzipファイルを解凍し、後でテキスト処理を行うための最善の解決策は何ですか?