2012-05-12 3 views
2

일부 큰 파일을 시도했지만 실패했습니다. 약 2.7GB보다 큰 파일을 mmap 할 수 없습니다.메모리가 충분하지만 mmap이 계속 실패합니다. 메모리를 할당 할 수 없습니다.

ulimit -a을하면 내 가상 메모리가 무제한이라고 말합니다. 나는 그 다음 cat /proc/meminfo을 만들었다. 나의 시스템은 3GB Memfree와 2GB Swapfree를 가지고 있다고 말한다.

최대 5GB의 파일을 mmap 할 수 있다고 가정합니다. 나는 MAP_NORESERVE 플래그를 사용하는 것을 포함하여 인터넷에서 배운 모든 것을 시도했으며 overcommit_memory1으로 설정했습니다. 여전히 동일합니다 (Cannot allocate memory). 무엇이 잘못 될 수 있습니까?

저는 64 비트 CPU와 32 비트 리눅스 시스템을 사용하고 있습니다. 더 이상 정보가 필요하면 알려주십시오. 조언이나 조언을 정말 고맙게 생각합니다.

답변

2

응용 프로그램에 큰 파일을 매핑하기에 충분한 주소 공간 (사용 가능한 메모리 주소)이 없습니다.

Linux에서 32 비트 커널에서 실행되는 32 비트 프로세스는 일반적으로 약 3GB의 주소 공간을 사용할 수 있으며 64 비트 커널에서 실행되는 32 비트 프로세스는 4GB의 주소 공간을 사용할 수 있습니다. 그 이상이 필요한 경우 응용 프로그램을 64 비트 프로세스로 컴파일해야합니다. 이렇게하면 최소 128TB의 주소 공간을 확보 할 수 있습니다.

+0

I 만나다! 귀하의 빠른 답변에 정말 감사드립니다! – tracy0325

10

32 비트 OS에는 충분한 주소 공간이 없기 때문에 64 비트 OS를 사용해야합니다.
편집 : 시스템에 사용할 수있는 실제 메모리가 있지만 32 비트 프로세스에서만 최대 4GB를 주소 지정하지만 커널 드라이버는 커널을 1 ~ 2GB 정도로 예약하므로 사용자 공간은 일반적으로 32 비트 응용 프로그램의 경우 2GB입니다.

+0

감사합니다. 그것은 모든 것을 설명합니다! – tracy0325

+1

커널 및 사용자 공간이 32 비트 인 경우 사용자 공간에 3GB를 사용할 수 있지만 다소 분열되며 최대 연속 가용성은 2.5GB 이하가 될 수 있습니다. 또한 구현시 포인터 감산에서 위험한 부호있는 정수 오버 플로우가 발생하므로 개별 구현이 2GB를 초과하는 구현을 금지 할 수 있습니다. 커널이 64 비트이지만 사용자 공간이 32 비트이면 32 비트 (4GB)의 전체 주소 공간이 사용자 공간 앱에서 사용할 수 있어야하지만 다시 조각화되거나 인접한 할당에 제한이있을 수 있습니다. –

관련 문제