2011-04-01 2 views
3

내장 된 .net 4.0 Gzip 및 Deflate Classes를 사용하여 3GB (압축되지 않은 7GB) gzip 파일을 프로그래밍 방식으로 압축 해제하는 데 문제가 있습니다.GzipStream (.net 4.0) 4GB 문제

필자는 4GB 이상의 파일을 모두 지원해야하지만, 제대로 작동하지 않는 것으로 알고 있습니다. WinRAR을 사용하여 문제의 파일을 수동으로 압축을 풀고 스트림 판독기 및 카운트 라인이있는 기본 csv 파일을 통해 스트리밍하면 예상 결과 인 약 7 천 5 백만 라인이 생성됩니다. 그러나 GzipStream 또는 DeflateStream을 사용하여이 작업을 수행하는 경우 스트림 판독기가 절반 이상 (4GB 표시 오른쪽)에서 멈추고 "스트림 끝"을보고하고 오류없이 끝납니다. 그 독자를 사용하여 나는 단지 스트림이 끝나기 전에 약 34million에 도착한다.

그 다음 최신 이진수 인 .net zip http://dotnetzip.codeplex.com/을 시도해 본 결과 중간에 오류가 발생합니다. "대상 배열의 길이가 충분하지 않습니다. destIndex 및 길이와 배열의 하한을 확인하십시오."

이 파일을 만들지는 않았지만 이전에 같은 소스의 작은 파일에 문제가 없었으므로 문제가 크기에 영향을 미쳤습니다. 이 파일을 만드는 데 사용 된 도구는 64 비트 호환이 아니지만 버그가 나오기 전에 gzip 추출기 논리에서 버그가 우리 편이 아닌지 확인하고 싶습니다.

모든 의견을 크게 기뻐할 것입니다. 예 추출 코드 아래 시험 방법 :

var msGZ = 0;//gives 34million 
var fileName = @"C:\MyFile.csv.gz"; 
using (System.IO.Stream input = System.IO.File.OpenRead(filename)) 
using (var gz = new GZipStream(stream, CompressionMode.Decompress)) 
using (var r = new StreamReader(gz)) 
{ 
    while (!r.EndOfStream) 
    { 
     r.ReadLine(); 
     msGZ++; 
    } 
} 



var msDF = 0; //gives 34million 
using (System.IO.Stream input = System.IO.File.OpenRead(filename)) 
using (var df = new DeflateStream(stream, CompressionMode.Decompress)) 
using (var r = new StreamReader(df)) 
{ 
    while (!r.EndOfStream) 
    { 
     r.ReadLine(); 
     msDF++; 
    } 
} 



var csvCount = 0;//roughly 75million lines 

using (var ms = System.IO.File.OpenRead("UncompressedBYWinRAR.csv")) 
{ 
    var r = new StreamReader(ms); 
    while (!r.EndOfStream) 
    { 
     r.ReadLine(); 
     csvCount++; 
    } 
} 




var zipNet = 0; 

//Zip.Net throws this error half way through at around line 34million 
//"Destination array was not long enough. Check destIndex and length, and the array's lower bounds." 

using (System.IO.Stream input = System.IO.File.OpenRead(filename)) 
using (Stream decompressor = new Ionic.Zlib.GZipStream(input, Ionic.Zlib.CompressionMode.Decompress, true)) 
using (var r = new StreamReader(decompressor)) 
{ 
    while (!r.EndOfStream) 
    { 
     r.ReadLine(); 
     zipNet++; 
    } 
} 
+2

[이 stackoverflow 게시물] (http://stackoverflow.com/questions/505190/net-deflatestream-4gb-limit)와 유사합니다. 아마 너를 도울거야? –

+0

나는 MS Guy가 실제로 그 제한에 대해 삭제 한 게시물에 댓글을 달았습니다. 그게 내 가정은 그것이 작동해야합니다 어디에서 온다 : http://stackoverflow.com/questions/505190/net-deflatestream-4gb-limit/505887#505887 – Glenn

+1

NET v2/3.5 압축 클래스는 4GB 제한하지만 .NET 4에서는 해당 주석이 제거되었습니다. 잘못된 클래스 파일을 사용하고있을 가능성이 있습니까? gratuitously .NET v4를 사용해 볼 수 있습니까? :-) – Ken

답변

0

사용 SharpZip 대신 Io.GZipStream 에서 GZipInputStream의 솔루션을 제공 하였다.