Blob

2012-10-21 7 views
3

을 업로드하는 동안 'System.OutOfMemoryException'유형의 예외가 발생했습니다. 큰 8GB 파일을 압축하고 Blob에 압축 파일을 업로드하려고합니다. 압축 파일 크기는 약 800MB입니다. 이제 Azure로 업로드하려고하면 예외가 발생합니다. 'System.OutOfMemoryException "최소 3 ~ 4 개의 파일을 압축하는 중 크기가 3Gb, 4GB, 8GB 인 동시에 BLOB에 업로드하십시오.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 비트 윈도우 2K8 서버와 기가 바이트 램에서 실행 해.이 문제 또는 모든 주소 공간 문제를 RAM이다. 이 문제에 제발 도와주세요

-Mahender

-Mahender

+0

전체 8GB 파일을 메모리에 단일 바이트 배열로 읽는 것처럼 보입니다. 아마 그럴 일은 없을 것입니다. 대신 파일로 스트림을 열고 청크로 작업 할 수 있는지를 알 수 있습니다. – vcsjones

답변

5

거대한 파일을 메모리에로드하는 경우는 거의 없습니다. 당신이 무엇을 작은 버퍼 (8k, 16k, 등)와 함께 반복하고, 그것을 스트림으로 업로드해야 할 일을해야합니다. 아마 그냥 전체 시나리오가 무엇인지에 따라 : 당신이 (있는 그대로 방금 스트림을 전달할 수 없습니다) 사전 처리 작업을 수행해야하는 경우

blob.UploadFromStream(compressedStream); 

가, 다시 (임시 파일로 작업 , 작은 버퍼를 통해 압축/압축 해제를 수행), 파일 스트림을 업로드 API로 전달하십시오.

스트림의 전체 지점은 버킷이 아닌 호스입니다. 너 으로 모든 것을 즉시 메모리에 넣으려고하지 말아야한다.

8GB 바이트 배열을 갖지 못하게하는 오브젝트 크기 및 배열 크기 제한이 있습니다. 의 요구 사항이있을 경우, 거대한 물건을 적재하는 악의적 인 방법이 있지만,이 경우에는 완전히 부적절합니다. 단순히 스트리밍 API를 올바르게 사용해야합니다.

1

게시물이 실제로 분명하지 않기 때문에 2 가지 문제가있을 수 있습니다.

1)이 .NET 될 수있다 프레임 워크 issure는 경우 코드는 64bit 아키텍처를 대상으로 하지 기록됩니다. 이 경우 귀하의 CLR 프로세스에 대해 3GB (매우 대략)의 메모리 제한이 있습니다.

2) 코드가 "원시"64 비트 응용 프로그램이므로 너무 많은 메모리를 할당합니다. 가능한 해결책 :

A))이이 경우에 가능한 경우 (메모리의 덩어리로 데이터 전송을 줄

b)는 스트림을 사용하고 귀하의 경우 가능하다면 (모든 데이터를로드하지 않음)

(건축 무관) CLR의 배열에 다른 메모리 제한이 잠재적으로 너무 귀하의 경우 초과 할 수 있음을,이 : 마크는 눈치

편집 또한

.

희망이 도움이됩니다.

+1

짝수 x64에서도 단일 바이트 배열에 2GB 제한이 남아 있습니다 (allow-large-objects 플래그가 설정된 상태에서도) –

+0

@MarcGravell : 좋은 지적입니다! – Tigran