.Net : Unzipling Gz file : 内存不足,无法继续执行程序
.Net : Unzipping Gz file : Insufficient memory to continue the execution of the program
所以我一直在使用下面的方法来解压 .gz 文件并且效果非常好。
它使用 SharpZip。
现在我正在使用更大的文件,它似乎试图解压缩内存中的所有内容给我:内存不足,无法继续执行程序。
我应该阅读每一行而不是使用 ReadToEnd() 吗?
public static void DecompressGZip(String fileRoot, String destRoot)
{
using FileStream fileStram = new FileStream(fileRoot, FileMode.Open, FileAccess.Read);
using GZipInputStream zipStream = new GZipInputStream(fileStram);
using StreamReader sr = new StreamReader(zipStream);
var data = sr.ReadToEnd();
File.WriteAllText(destRoot, data);
}
正如@alexei-levenkov 所建议的那样,CopyTo 将在不耗尽所有内存的情况下对副本进行分块。
奖励积分,使用异步版本以获得线程优势。
public static async Task DecompressGZipAsync(String fileRoot, String destRoot)
{
using (Stream zipFileStream = File.OpenRead(fileRoot))
using (Stream outputFileStream = File.Create(destRoot))
using (Stream zipStream = new GZipInputStream(zipFileStream))
{
await zipStream.CopyToAsync(outputFileStream);
}
}
所以我一直在使用下面的方法来解压 .gz 文件并且效果非常好。
它使用 SharpZip。
现在我正在使用更大的文件,它似乎试图解压缩内存中的所有内容给我:内存不足,无法继续执行程序。
我应该阅读每一行而不是使用 ReadToEnd() 吗?
public static void DecompressGZip(String fileRoot, String destRoot)
{
using FileStream fileStram = new FileStream(fileRoot, FileMode.Open, FileAccess.Read);
using GZipInputStream zipStream = new GZipInputStream(fileStram);
using StreamReader sr = new StreamReader(zipStream);
var data = sr.ReadToEnd();
File.WriteAllText(destRoot, data);
}
正如@alexei-levenkov 所建议的那样,CopyTo 将在不耗尽所有内存的情况下对副本进行分块。
奖励积分,使用异步版本以获得线程优势。
public static async Task DecompressGZipAsync(String fileRoot, String destRoot)
{
using (Stream zipFileStream = File.OpenRead(fileRoot))
using (Stream outputFileStream = File.Create(destRoot))
using (Stream zipStream = new GZipInputStream(zipFileStream))
{
await zipStream.CopyToAsync(outputFileStream);
}
}