2012-06-08 4 views
1

이미지 처리를 수행 할 다중 스레드 서비스를 만들었습니다. 우리 고객 중 한 명이 메모리가 많은 16 개의 프로세스 서버에 제품을 설치할 때까지 모든 것이 잘 작동했습니다. 이제 서비스는 많은 메모리 부족 오류를 발생시킵니다. 프로세스가 설치되는 양에 관계없이 1.5GB의 메모리 만 얻을 수 있기 때문에 이해할 수 있습니다.다중 스레드/다중 프로세스 Windows 서비스

이 상황에서 받아 들여지는 해결책은 무엇입니까? 대신이 서비스가 별도의 작업자 프로세스를 생성해야합니까? CPU 당 하나의 작업자 프로세스가 명명 된 파이프를 통해 주 서비스에 연결해야합니까?

EDIT 우리가 64 비트 서버에서 실행되지만 때문에 이미지 라이브러리 제한

의 64를 타겟팅 할 수 없습니다하면

+0

64 비트 컴퓨터입니까? 그렇다면 x86이 아닌 x64를 대상으로 어셈블리를 빌드하십시오. – ken2k

+0

예, 그렇습니다. 불행히도 x64를 타겟팅 할 수 없습니다. 이미 해당 플랫폼에서 실행할 수있는 이미징 라이브러리가 없기 때문입니다. Leadtools를 사용합니다. –

+0

전체 소스 코드 샘플을 포함하는 최종 솔루션은 무엇입니까? – Kiquenet

답변

2

이 여러 솔루션이 있습니다 감사합니다. 다음은 몇 가지 옵션입니다.

  1. .exe를 /LARGEADDRESSAWARE option으로 연결하십시오. 그러면 앱에 최대 3 기가의 RAM이 제공되며 다른 변경은 필요하지 않습니다.
  2. 64 비트 버전 용 32 비트 바이너리를 제공 한 소프트웨어 공급 업체에 문의하십시오.
  3. 32 비트 종속성을 out-of proc (예 : COM 또는 WCF를 통해 통신)로 이동하고 EXE 아키텍처를 64 비트로 변경하십시오.
  4. 스레드가 아닌 각 실행 작업에 대해 새 프로세스를 생성합니다.
  5. 코드를 Address Windowing Extensions으로 변환하십시오.

옵션 # 1과 # 2가 가장 구현하기 쉽지만 # 5는 가장 어렵습니다.

수정 나는 C# 태그를 보았습니다. 관리되는 앱의 경우에도 EditBin.exe tool을 사용하여 큰 주소 인식 플래그를 사용할 수 있습니다.

+0

64 비트 Windows에서 대규모 주소 인식 응용 프로그램은 실제로 전체 4GB 주소 공간에 액세스 할 수 있습니다. –

+0

감사합니다. 옵션 3은 나를 포기하지 않을 것이다. 왜냐하면 코드가 날아가는 것은 32 비트가되어야하기 때문이다. 불행히도 옵션 2가 없습니다. 옵션 4는 Windows 서비스에서 수행 할 때 회의적으로 보입니다. 이제 옵션 1 - .net 응용 프로그램에서 가능합니까? –

+0

@Brian - 지난번 개인적인 경험으로 나는 2.5 Gig을 할당 할 수있었습니다. 전체적으로 4 기가는 아니지만 2 기가 기본 제한보다 분명히 많습니다. –