2008-10-14 3 views
32

현재 SQL 데이터베이스에서 데이터를 꺼내어 다른 응용 프로그램 (웹 사이트, 웹 서비스 등)에서 사용할 수 있도록 캐시 시스템을 구축하려고합니다. . 우리는 캐시가 Windows 서비스로 실행되고 기본적으로 캐시 항목을 보유하는 스마트 사전으로 구성되어 있다고 가정합니다. 내 질문은 응용 프로그램의 작업 집합 (Windows 서버 2003에서 실행될 것입니다)에 제한이 있습니까? 또는 실제 메모리의 양이 한계입니까?하나의 .NET 프로세스에 대한 메모리 제한이 있습니까

+1

는 캐시 만료 정책을 고려하십시오. 나중에 굽기가 어렵습니다. 나는 이것을하기를 원하는 좋은 이유가 있다고 가정한다. 오프라인 액세스. 성능이 충분히 좋은 이유는 아닙니다. 로컬 시스템의 메모리 오버 헤드를 통해 성능을 저하시킬 수 있습니다. –

+0

실제로 성능이 한 가지 이유입니다. 두 번째는 캐시를 중앙 집중화하여 다양한 온라인 및 오프라인 응용 프로그램에 액세스 할 수있게하려는 것입니다. 캐시 시스템을 구축 한 경험이 있습니까? 더 읽을 거리를 권해 주시겠습니까? – Mats

+0

ASP.NET 캐시 시스템은 몇 가지 아이디어를 얻거나 캐싱 응용 프로그램 블록을 얻을 수있는 좋은 곳입니다. http://msdn.microsoft.com/en-us/library/cc309502.aspx –

답변

39

32 비트 또는 64 비트? 32 비트는 2 기가 바이트 (프로세스 용), 64 비트는 1TB (enterprise edition 2003 server)입니다.

However, the maximum size of a CLR Object is 2gb 64 비트에서도 마찬가지입니다.

업데이트 : 위의 정보는 2008 년 정확한 내용입니다. 자세한 내용은 Ohad's answer을 참조하십시오. Windows 2016 서버의 최대 값은 24TB입니다. 당신은/3GB 플래그와 함께 윈도우를 부팅하고 "알고 큰 주소"

+0

읽어 주셔서 감사합니다.이 게시물은 .net 2.0 릴리스 전에 작성된 것 같습니다. 이후 버전에서 변경된 경우 궁금하다. – Mats

+2

런타임 버전 2.0 관련이 있지만 3.5에서 변경되었다고 생각하지 마십시오. 바이트 배열이 아니라면 2GB의 단일 객체를 갖는 것이 상당히 이상한 경우입니다 - 귀하의 경우에는 N 크기의 객체 목록이므로 괜찮을 것입니다. –

+1

제한 사항은 .NET 4에서도 동일합니다. –

0

다른 Windows 프로그램과 마찬가지로 주소 공간이 제한적입니다. 즉, 32 비트에서 2GB의 주소 공간을 가질 수 있습니다. x64에서는 8TB를 사용할 수 있습니다.

실제 메모리가 8TB가 아닌 경우 페이지가 시작됩니다.

+1

그리고 ' 8TB의 여유 하드 드라이브 여유 공간이 있습니다. 그러면 OutOfMemoryException을 얻을 수 있습니다. 너무 나빴어. 하지만 우리 중 상당수가 HDD를 개발 시스템에 탑재하기까지는 다소 시간이 걸릴 것입니다. : –

4

, 실제로

아니 직접 질문에 대한 답변 이 문제에 접근하는 또 다른 방법은 큰 함정 중 일부를 벗어나므로 솔루션 캐싱의 주요 골칫거리가 될 수 있습니다. (죄송합니다.이 문제에 관해 권장할만한 책이 없습니다.)

우리는 이전 프로젝트에서 이것을 구현했으며 다른 문제를 만들었습니다.

오프라인 액세스의 경우 데스크탑에서 sql express를 사용하여 데이터베이스의 미러 (또는 캐시해야하는 비트)를 만들 수 있습니까? 그런 다음 응용 프로그램이 가리키는 데이터베이스를 전환하면됩니다. diff를 저장하여 서버에 재생할 수도 있습니다.하지만 다른 문제가 있습니다. 로컬 복사본에 대한 사용 권한을 변경하여 해당 복사본이 있어야하는 경우 읽기 전용으로 만들 수 있습니다.

당신은 소리를 놀라 울 정도로 생성하려고 생각하는 사전은 SQL 색인과 같습니다. 나는 당신이 그렇게 설계 할 수 있다면 당신을 위해 일을하기 위해 SQL에 의존 할 것이다. 왜 그 바퀴를 재발 명합니까? 그렇다면 캐시 만료 및 메모리 관리에 대해주의 깊게 생각해야합니다. 특히 이것이 Windows 서비스 인 경우 더욱 그렇습니다.

행운을 빌어 요,

+0

이 링크에 대한 추가 정보가 있습니까? – Mats

+2

XP에서 더 많은 메모리를 얻는 것은 아닙니다 (즉, 4GB RAM 이상). 최대 3GB의 RAM 프로세스를 실행할 수 있습니다. http://msdn.microsoft.com/en-us/library/ms791558 aspx –

+1

또한 Virtual PC 또는 Virtual Server에서 사용하지 마십시오. http://blogs.msdn.com/virtual_pc_guy/archive/2004/12/23/331100.aspx –

1

마티아스와 같은 응용 프로그램을 신고함으로써 좀 더 많은 메모리를 얻을 수있는 32 비트 Windows의

20

는 최근 32 비트 프로세스를 .NET에서 메모리 제한 주위에 광범위한 프로파일을하고있다. 우리는 모두 .NET 어플리케이션에서 2.4GB (2^31)까지 할당 할 수 있다는 생각에 포격 당했지만 불행하게도 이것은 사실이 아닙니다. (애플리케이션 프로세스는 사용할 공간이 많고 운영 체제는 훌륭합니다. 우리가 관리하고있는 일이지만, .NET 자체에는 메모리 제한을 가하는 전형적인 실제 응용 프로그램의 경우 대략 600 ~ 800MB를 차지하는 고유 한 오버 헤드가있는 것으로 보입니다. 즉, 대략 정수 배열을 할당하면 1.4GB라면 OutOfMemoryException()을 볼 것으로 예상됩니다.

분명히 64 비트에서이 제한은 나중에 발생합니다 (5 년 안에 채팅하겠습니다).하지만 메모리의 모든 일반적인 크기도 커집니다 (단어가 늘어남에 따라 1.7 ~ 2 배가됩니다). 크기.

확실히 알고있는 사실은 운영 체제의 가상 메모리 아이디어가 한 프로세스 내에서 사실상 무한한 할당 공간을 제공하지 않는다는 것입니다. 한 번에 실행되는 모든 (많은) 응용 프로그램에 대해 전체 2.4GB를 처리 할 수 ​​있도록하기위한 것입니다.

+0

누군가이 시점을 확인할 수 있습니까? 그것은 매우 관련이 있습니다. –

+0

내 테스트에 따르면 실제로 확인할 수는 있지만 사실로 판단됩니다. –

12

MSDN의 다음 표는 사용자 쿼리에 대한 가장 정확한 답변입니다. IMAGE_FILE_LARGE_ADDRESS_AWARE 플래그는 관리 컴파일러에서 직접 설정할 수 없습니다. 다행히 빌드 빌드 via the editbin utility을 설정할 수 있습니다. 4GT는/3gb 플래그를 나타냅니다. 당신이 코드의 첫 번째 줄을 쓰기 전에

alt text

관련 문제