C# new double[2억] 할당 문제에 대해 알아낸 것들
먼저 간단히 기초를 설명하면,
new double[2억]을 할당할 경우
double이 8바이트 형이므로 16억 바이트를 할당을 시도하게 되며,
16억바이트는 1.5GB 정도에 근접해서, 32비트의 경우 2GB 메모리 사용제한에 근접하게 된다.
일단 32비트 설명
- VB6, C++은 2GB 메모리를 거의 풀로 뽑아쓰는게 가능해서 new double[2억]에 해당하는 메모리가 할당 잘됨.
- C#은 단일 배열 800MB가 한계. 여러배열 1200MB가 한계. 이 이상 할당을 할경우 아웃오브메모리 발생.
그래서 new double[2억]은 커녕 1억도 간당간당함. XP 됐다 말았다 함.
- 단, 이는 XP에서 윈8.1까지 기준이고, 윈10에서는 좀 케바케가 된다.(참고로 XP는 한계가 더 작은듯하다. 700MB나 그 근처인듯.)
- 윈10 똑같은 버전(TH2)가 깔린 곳 2군데서 해봤는데, 하나는 되고 하나는 안됨.
둘 중 되는쪽은 VS2015 깔려 있음. VS의 영향인듯하다.(업그레이드 막아놔서 RS1부터는 없어서 실험 안 해봄.)
물리 메모리는 되는쪽이 더 적음. 실제 메모리 부족은 아님.
- 윈7에 VS2017 깔린 컴에서도 됨.
그러니까 VS 영향은 맞는데, 그냥 VS 영향이 아니라, https://msdn.microsoft.com/ko-kr/library/hh925568(v=vs.110).aspx
위 링크에 따른 버전 확인결과 위에서 된다고 확인된 윈10, 윈7 모두 .NET 4.6.1이 모두 깔림.
(근데 안되는 윈10도 4.6.1이 깔려있는데도 안됨. 그게 좀 이상.)
환경변수 같은걸로 대충 닷넷버전 보는거는 다 4.0으로 나와서 그걸로는 진짜 버전 모름. 위 링크 소개대로 레지스트리 확인해야함.
- 윈도우 업데이트 잘 안하는 성격이라 업데이트 몇년 안해서 각 OS별로 최신버전 풀 업데이트 하면 어떻게 될지 확실히 모르겠음.
단, XP는 딱 4.0까지라서 XP는 아예 노답.
근데 아무리 업뎃 안했어도, 윈10마저 안될정도면 좀...
- 내가 VS2010을 주로 쓰는데, 여기서 빌드한게 XP에서도 돌아가고,(물론 VS2017에서도 4.0 타겟 잡아 개발하면 됨)
위에 실험한 파일들 모두 VS2010에서 릴리즈 빌드해서 갖다 쓴거임. 즉, 4.0으로 개발해도 메모리 한계는 딱 사용하는 OS의 닷넷버전 따라 가는거 같음.
- 닷넷 가비지 컬렉션이 지 맘대로라서,
최초 1회 할당이 저만큼이 되는거지 연속해서 할당 해제 이런게 안됨. 400MB짜리를 연속 할당에도 XP에서는 아웃오브메모리 뜸.
(단, 단순히 재할당 전에 배열변수에 null만 줘도 알아서 GC하고 새로 할당은 하더라.)
- C++ CLR도 그냥 딱 닷넷 제한에 걸림.
- C++ DLL을 C#에서 불러와도 그냥 닷넷 제한에 걸림.
예를들어 C#에서는 abc(2억); 만 호출하고, C++로 제작한 DLL 속에 전역변수포인터에 new double[2억]을 넣음. 역시 2억 할당 안되고 똑같이 800MB 제한.
ㄴ 역으로는 뻔할거 같아서 안 해봄.
결론 : 32비트에 메모리 많이 써야하는건 C++ 써라. 래핑이고 DLL이고 좆이고 안됨.
그냥 딱 C++ 써야됨. C++ 안되면 VB6 써야할 지경. 당연히 VB.NET은 안됨.
64비트 설명
- 64비트 응용프로그램 가용메모리가 8TB 라고 하던데, 확실히는 모르겠다.
- 당근 VB6는 32비트 전용이라 불가. C++은 내가 그만한 메모리가 없어서 확인 불가하지만 물리메모리 4GB에서 4.8GB까진 가상메모리로 땡겨봄.
(지금 8기가 컴 앞에 앉았지만, 귀찮아서 안함.)
- C#은 단일배열 2GB가 한계. 여러개는 귀찮아서 안 해봄.
(즉 .NET은 64비트가 되어서야 32비트 다른 언어랑 삐까 뜨는거.)
- 위 제한은 역시 .NET 4.5 이상 버전에서 더 올라간다고 하는데, 한계는 안해봐서 모름.
무슨 옵션 줘야된다는데 하다가 안돼서 때려침.
결론 : 당연한 얘기지만, 어느 언어건 메모리는 필요하면서 64비트 가능하면 64비트 써라.
VS 만 깔렸으면 된다거나,
윈10 최신빌드면 된다거나 그런게 중요한게 아님.
C#으로 개발한걸 그거 안깔린 컴에 쓸 수도 있다는 사실이 중요한거임.
XP는 몰라도 윈7, 윈8.1, 업글안한 윈10 정도는 쓸수도 있음.
대강 봐서는 닷넷 4.5까지도 확장 안해준거임.
그래서 메모리 이슈 생길거 같으면 VS 안깔린 컴에서 꼭 해봐야됨.
그나저나 전에 C#으로 뭐 하다가
1GB 가까이 터치한적 있는데, C#이 메모리부족으로 뻗더라고.
32비트가 2GB 제한인데 이럴리가 없을거라 생각하고
난 내가 마냥 잘못 짠줄만 알았지.
저런 제한이 있을줄이야... ㅅㅂ
다른 애들도 C#에서 뭐 하다가 메모리 부족뜬다고 난리칠때 눈치 깠어야했는데...
공부자료 감사