現在、GZip で圧縮されたファイルを抽出しようとしています。Windows Mobile 6 を使用して、モバイル デバイスでプログラムによって実行したいと考えています。Compact Framework 3.5 と C# を使用しています。
圧縮後のファイルサイズは約4MBです。また、元のファイル (テキスト ファイル) のサイズは約 42 MB です。抽出中にアルゴリズムがクラッシュします。毎回、解凍したファイルのサイズが約 33.2 MB になるとクラッシュします。
ファイル サイズの制限が原因でアルゴリズムがクラッシュすることはありますか? コンパクト フレームワークには約 32 MB のメモリ制限があることはわかっていますが、バッファを使用してファイルを抽出することを考えると、このメモリ制限を満たすべきではありません。私は正しいですか?
アルゴリズムは次のとおりです。
private void Extract(string GZippedFile, string TargetFile)
{
int BUFFER_SIZE = 32768;
using (FileStream InStream = new FileStream(GZippedFile, FileMode.Open, FileAccess.Read))
{
using (GZipStream GZipStream = new GZipStream(InStream, CompressionMode.Decompress))
{
using (FileStream OutStream =
new FileStream(TargetFile, FileMode.Create, FileAccess.Write))
{
byte[] tempBytes = new byte[BUFFER_SIZE];
int i;
while ((i = GZipStream.Read(tempBytes, 0, tempBytes.Length)) != 0)
{
OutStream.Write(tempBytes, 0, i);
}
}
}
}
}
また、通常、Windows Mobile でメモリの上限に達すると、システム メッセージが表示されます。これは、このプログラムがクラッシュした場合には当てはまりません。
また、デバイスには十分なストレージ メモリとプログラム メモリが残っています (システムの [設定] >> [メモリ] で表示されます)。
何か考えはありますか?
編集:申し訳ありませんが、私は間違っていたと思います。実際、この問題は、Visual Studio でプログラムをデバッグしているときにのみ発生しました。また、TCp/Connect を使用して Visual Studio とデバイスをリンクしています。
本当の問題は次のとおりだと思います。
ファイルの抽出には多くのデバイス リソースが必要です。
デバイスがビジー状態であるため、Visual Studio との TCP 接続を維持できません。
Visual Studio とデバイス間の接続が失われ、プログラム全体がクラッシュし、デバイス上のユーザーに警告は表示されません (Visual Studio が実行されている PC では、接続が失われたことを警告するメッセージが表示されます)。
Visual Studio デバッガーを使用しない場合、すべて正常に動作します。
EDIT : ctackle コメントにより、問題は発生しなくなりました。ヒントは、
System.Threading.Thread.Sleep(1);
この命令は、ループ中に Visual Studio にハンドルを与え、プログラムがクラッシュするのを防ぎます。