하나의 프로그램에서 사용할 수 있는 메모리의 최대 크기가 있나요?

standalon의 이미지

하나의 프로그램에서 활용할 수 있는 메모리의 한계가 있는 것 같은데, 검색해도 관련 내용을 찾을 수 없어서 여기에 질문을 드립니다.

우분투 18.04에서 C++ 프로그램을 개발 중인데, 배열 사이즈를 일정 크기 이상 선언하면 처음 부분에서 프로그램이 종료됩니다. (프로그램이 거이 대부분 thread가 실행하는 부분에서 메모리를 선언하고 실행됩니다.)

int main() {
	vector<thread> main_Threads;        // 프로그램 종료
	// ...
}

빅데이터 관련 프로그램으로서, 실행 속도가 중요해서 모두 메모리에 올려서 실행하려고 합니다.
프로그램이 사용할 수 있는 메모리 한계가 있는 것이 정말 맞는지?
용량 제한을 해제하는 방법이 있는지?
제한 해제가 안된다면, 이런 프로그램은 어떻게 구현해야 하는지?
다른 곳(ex. 파일, etc)에 데이터를 저장해 놓고 다시 읽는 방법은 실행 속도 면에서 효율성이 많이 떨어질 것 같은데, 다른 방법은 없는지?

많은 조언 부탁드립니다.
감사합니다.

서지훈의 이미지

기본적으로 메모리라 하면 크게 2가지... stack과 heap으로 나누게 되는데요.

지금 사용하실려는 array(배열)은 stack 영역입니다.

이건 기본적으로 8M로 잡혀 있습니다.

$ ulimit -s
8192

이건 필요에 따라 늘릴 수도 있지만, 이건 꼭 필요한 경우가 아니면 좋은 방법은 아니고요.
heap 영역의 메모리를 사용하시는게 맞을듯합니다.
malloc() or new

여튼 stack은 거의 default 상수이고, heap은 ram에 따라서 늘어나니 heap은 stack 보다 더 크게 사용할 수 있습니다.
그리고, stack은 되도록이면 사용을 자제 하는게 좋은게 이건 시스템에서 사용하니 사용자가 많이 사용하는건 의도치 않은 버그도 만들 수 있습니다.

되도록 이면 배열은 Mega 단위는 지양 하시는게 좋습니다.

그리고, stack과 heap에 대해서 구글링으로 어느 정도 알아 보시는걸 추천드립니다.

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

라스코니의 이미지

stackoverflow에 좋은 답변(https://stackoverflow.com/questions/8036474/when-vectors-are-allocated-do-they-use-memory-on-the-heap-or-the-stack)이 있네요.

물리적 메모리 사이즈가 얼마인지, 예상하는 vector 사이즈가 얼마인지 말씀해 주시면 더 코멘트가 달릴 것 같네요.

standalon의 이미지

stack 영역에 메모리를 할당한 이유는 실행 시간을 줄이기 위해서 였습니다.
(제가 알기로는,) stack에 할당된 메모리는 프로그램 시작전에 할당되고,
heap에 할당된 메모리는 프로그램 실행 중에 할당되기 때문입니다.
그런데, 지훈님이 설명해주신대로 heap 영역에 할당해서 사용해야 할 것 같습니다.

그리고, 물리적인 메모리 사이즈와는 무관한 것 같았습니다.
왜냐하면, 제가 구입한지 얼마되지 데스크탑과 10년 넘은 노트북에서 번갈아가면서 테스트 했는데,
동일한 사이즈에서 에러가 발생하였습니다.
참고로, 노트북의 메모리 사이즈는 3.8 G 입니다.
그리고, vector 사이즈는 프로그램이 복잡해서 계산하기 어렵네요.

답변 감사합니다.

라스코니의 이미지

조언을 드리자면,,,

stack 영역에 메모리를 할당한 이유는 실행 시간을 줄이기 위해서 였습니다. ==> 어느정도 맞습니다. 접근하는 주소가 가까이 있을 확률이 많기 때문에 좀더 빠른 실행에 유리합니다.

(제가 알기로는,) stack에 할당된 메모리는 프로그램 시작전에 할당되고,
heap에 할당된 메모리는 프로그램 실행 중에 할당되기 때문입니다. ==> stack 관련한 부분은 제가 알기로는 아닙니다. 중요한 부분은 malloc(), new 등이 heap 영역을 사용하고 좀 더 큰 메모리를 할당받는 것을 가능하게 한다는 겁니다.

그런데, 지훈님이 설명해주신대로 heap 영역에 할당해서 사용해야 할 것 같습니다. ==> 위에 stackoverflow 글을 읽어 보시면 vector 역시 실제 데이터에는 heap 영역을 할당받아 사용한다고 되어 있습니다.

물리적인 메모리 사이즈와는 무관한 것 같았습니다. ==> 물리적 메모리와 큰 관련이 있습니다. 우선 물리적 메모리가 적으면 heap을 사용한다고 해도 하드 디스크 swap 영역이 사용될 수도 있음으로 오히려 실행 속도가 매우 떨어집니다.

동일한 사이즈에서 에러가 발생하였습니다.
참고로, 노트북의 메모리 사이즈는 3.8 G 입니다.
그리고, vector 사이즈는 프로그램이 복잡해서 계산하기 어렵네요. ==> 그래서 사이즈 예측이 필요합니다. 아주 정확하지 않더라도 최소한 100 Mbyte 오더로는 사이즈를 알아야 대책을 세울수가 있을 것 같네요. 그렇지 않으면 어떤 오류가 발생했을 때 메모리 크기때문에 오류가 나는지 너무 큰 데이터 처리 로직 자체에 문제가 있는지 추적해 나갈 수 있습니다.

jick의 이미지

왠지 프로그램이 죽는 부분은 놔두고 전혀 상관없는 부분의 코드를 올리신 것 같은 느낌이 들지만, 설명대로 "배열 사이즈를 일정 크기 이상 선언하면 처음 부분에서 프로그램이 종료"되는 상황이고 그 배열이 (일단 올리신 코드에는 없으니) 쓰레드 시작 부분에서 스택에 잡는 거라면, 배열을 스택에 잡는 게 문제일 수 있습니다.

서지훈 님이 위에 쓰셨지만, OS 입장에서 사용자가 쓰레드를 몇 개를 만들지 모르기 때문에, 보통 쓰레드에서 사용하는 스택의 크기는 매우 제한되어 있습니다. 스택에 배열을 잡지 말고 동적 할당으로 배열을 잡아서 사용하세요. 아니면 배열을 쓰지 말고 그냥 vector를 쓰는 것도 한 가지 방법입니다. (알아서 동적 할당.)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.