3

大きな8GBのファイルを圧縮し、圧縮したファイルをBlobにアップロードしようとしています。圧縮ファイルサイズは約800MBになります。Azureにアップロードしようとすると、例外「System.OutOfMemoryException」が発生します。サイズが3Gb、4GB、8GBのファイルを並行して少なくとも3〜4個圧縮し、BLOBへのアップロードを続行します。

これが圧縮のコードです

 public string UploadFile(string fileID, string fileName, string choice,Stream CompressedFileStream)
    {
       byte[] data = new byte[CompressedFileStream.Length];
        CompressedFileStream.Read(data, 0, data.Length);
        long fileSize = CompressedFileStream.Length;
        inputStream.Dispose();   

   }

        blob.ServiceClient.WriteBlockSizeInBytes = 4 * 1024 * 1024;
        blob.ServiceClient.ParallelOperationThreadCount = 5; 
        //this will break blobs up automatically after this size
        blob.ServiceClient.SingleBlobUploadThresholdInBytes = 12582912;
        startTime = DateTime.Now;
                    using (MemoryStream ms = new MemoryStream(data))
                    {
                        ms.Position = 0;
                        blob.UploadFromStream(ms);
                    }

64ビットWindows2k8サーバーと4GBRAMで実行しています。RAMの問題ですか、それともアドレス空間の問題ですか。この問題について私を助けてください

-マヘンダー

-マヘンダー

4

2 に答える 2

5

そのような巨大なファイルをメモリにロードすることはめったにありません。通常行うべきことは、小さいバッファー(8k、16kなど)でループし、それをストリームとしてアップロードすることです。完全なシナリオが何であるかに応じて、おそらく次のようになります。

blob.UploadFromStream(compressedStream);

前処理作業を行う必要がある場合(そしてストリームをそのまま渡すことはできません)、一時ファイルで作業し(ここでも、小さいバッファを介して圧縮/解凍を行います)、ファイルを渡します-アップロードAPIにストリーミングします。

ストリームの全体的なポイントは、それがバケツではなくホースであるということです。すべてを一度にメモリに入れようとしないでください。

オブジェクトサイズとアレイサイズの制限により、8GBのバイトアレイを使用できなくなります。そうするための要件が​​ある場合、巨大なオブジェクトをロードする邪悪な方法がありますが、この場合、それは完全に不適切です。単純に、ストリーミングAPIを正しく使用する必要があります。

于 2012-10-21T17:27:02.803 に答える
1

あなたの投稿からは本当に明確ではないので、2つの問題がある可能性があります。

1)コードがアーキテクチャを対象とせずに記述されている場合、これは.NETFrameworkの問題である可能性があります。この場合、プロセスには3GB(ほぼ)のメモリ制限があります。64bitCLR

2)コードは「ネイティブ」64ビットアプリケーションであるため、割り当てすぎるメモリが多すぎます。可能な解決策:

a)メモリのチャンクへのデータ送信を減らします(これが可能な場合)

b)ストリームを使用し、すべてのデータをロードしないでください(可能な場合)

編集

さらに、Marcが気付いたように、CLR(アーキテクチャに関係なく)の配列には別のメモリ制限があり、あなたの場合もそれを超える可能性があります。

お役に立てれば。

于 2012-10-21T17:29:25.937 に答える