2013-01-03 3 views
0

WCF 클라이언트/서버를 개선하여 현재의 것보다 빠르게 많은 수의 작은 파일을 처리하려고합니다.많은 수의 작은 파일 다운로드

나는 네트워크를 통해 파일을 이동하기 위해 WCF 클라이언트와 서버를 작성했습니다.

나는 그것이 스트림

간단한 예를 반환하는 서버를 가진 후 클라이언트에서 서버로 전화를 걸 (I 매개 변수로 다운로드 할 파일의 이름을 전송)에 의해 작업이 :

//CLIENT CODE>> 
Stream stream = syncService.GetStream(fileName); 
//<<CLIENT CODE 

//SERVER CODE>> 
public Stream GetStream(string fileName) 
{ 
    string filePathOnServer = ServerService.Service1.SERVER_FILES_PATH + fileName; 
    return File.OpenRead(filePathOnServer); 
} 
//<<SERVER CODE 

여러 파일을 가져와 클라이언트 컴퓨터의 파일에 저장해야하는 경우 GetStream을 재귀 적으로 호출합니다. 적은 수의 대용량 파일을 이동할 때 잘 작동합니다. 문제는 크기에 관계없이 하나의 파일을 다운로드하는 오버 헤드가 약 1/10 초입니다. 따라서 1Kb 파일의 엄청난 수를 다운로드하고 싶다면 필자는 본질적으로 최대 10Kbs까지 제한됩니다.

누군가가 대체 구현에 대한 제안을 받기를 바랍니다. 서버에서 스트림 목록을 반환하려고했지만 WCF가이 목록을 허용하지 않습니다.

파일을 압축하지 않고이 작업을 수행 할 수 있어야합니다.

여러 스트림으로 구성된 하나의 스트림을 반환하려고 시도했지만 더 나은 방법이 있는지 확신 할 수 없습니다.

+1

파일 목록을 매개 변수로 전달하고 모든 파일을 단일 스트림으로 반환하는 것이 좋습니다. 간단히 각 파일 앞에 스트림의 파일 길이를 추가하고 반환 된 데이터를 파싱하고 분할하십시오. – Pete

+0

@Pete 답장을 보내 주셔서 감사합니다. 그것은 내가 현재 고려하고있는 것이지만 더 나은 선택이 될 것이라고 생각했습니다. 누구든지 다른 제안이 있는지를 기다리는 동안 코딩 할 것입니다. – HaemEternal

+1

서비스 호스팅 방법은 지정하지 않지만 IIS에서 호스팅되는 경우 각 WCF 메서드 호출에 대해 HTTP 연결을 만들어 열어야합니다. 많은 호출을 처리 할 때 오버 헤드가 많습니다. – Pete

답변

3

파일 이름 모음 (예 : List<string> 또는 string[])을 수락하도록 WCF 방식을 변경 한 다음이를 압축합니다. 나는 SharpZipLib이 ZIP 파일을 만드는 데 잘 작동한다는 것을 알고 있습니다.

ZIP 파일을 클라이언트로 다시 스트리밍하면 클라이언트가 압축을 풀고 파일을 처리합니다.

하나 개의 큰 파일 크기 순서가 빠른 (적은 네트워크 관련 오버 헤드를 다루는 것 때문에) 대역폭에 라이터를 전송하지 당신이 아니라 하나의 WCF 호출을 할 것이다는 사실을 언급해야한다 하나의 파일 당 하나의 병목 현상 (거대한 병목 현상).

+0

제안에 감사드립니다. 절대적으로해야하지 않는 한 파일 압축을 피하기 위해 최선을 다하고 있습니다. 하지만 당신이 옳다면,이 문제를 해결해야합니다. – HaemEternal

+0

압축을 비활성화 할 수도 있습니다. ZIP은 컨테이너 형식 일뿐입니다. – usr

+0

@usr 동의하지만 데이터를 압축하는 데 "시간을 낭비한다"는 경우 (즉, TXT 파일이 너무 많이 압축되거나 너무 많이 압축 된 JPEG가 아닌) 파일이 무엇인지에 따라 달라집니다.압축하는 데 3 초가 걸리지 만, 작은 zip 파일을 스트리밍하면 20 장이 절약됩니다. – Alex

관련 문제