외부 정렬의 주된 이유는 데이터가 메인 메모리보다 클 수 있다는 것입니다. 그러나 이제 가상 메모리를 사용하고 가상 메모리가 주 메모리와 디스크를 서로 바꿔줍니다. 왜 우리는 그럼 외부 정렬을해야합니까?외부 정렬이 필요한 이유는 무엇입니까?
답변
외부 정렬 알고리즘을 사용하면 대량의 데이터를 효율적으로 정렬 할 수 있습니다 (데이터가 실제 RAM에 맞지 않는 경우에도 마찬가지 임).
메모리 내 정렬 알고리즘을 사용하고 가상 메모리가 외부 정렬 (즉, 데이터를 정렬 함)에 대한 기능 요구 사항을 충족시키는 동안 효율적이지 않은 비 기능 요구 사항을 달성하지 못합니다. 좋은 외부 정렬은 외부 저장소에 읽혀지고 쓰여지는 데이터의 양을 최소화하며 (역사적으로는 탐색 시간이기도 함),이를 위해 설계되지 않은 정렬 알고리즘의 범용 가상 메모리 구현은 IO를 최소화하십시오.
외장 정렬이 적은 디스크 IO를 위해 더 잘 최적화 된 @ Anonymous의 대답 외에도 가끔 가상 메모리를 사용하고 가상 메모리를 사용하는 것이 가상 메모리 공간이 파일 크기보다 작기 때문에 실행 불가능합니다.
예를 들어 32 비트 시스템이 있고 (여전히 많이있는 경우), 20GB 파일을 정렬하려면 32 비트 시스템을 사용하면 2^32 ~ = 4GB 가상 주소를 가질 수 있지만
이 문제는 64 비트 시스템이 아직 많이 사용되지 않았기 때문에 이전에는 여전히 32 비트 시스템 및 일부 임베디드 장치에서 여전히 중요한 문제였습니다.
그러나, 이전 답변에 expained으로도 64 비트 시스템, 외부 정렬 알고리즘은 더 정렬의 성격에 최적화되고, OS를시키는 것보다 훨씬 적은 디스크 IO가 필요합니다 "일을 돌볼 ".
Windows를 사용하고 있는데, 공용 줄 셸에서 "systeminfo"를 실행할 수 있습니다. 내 노트북의 메모리 사용 정보를 제공합니다.
Total Physical Memory: 8,082 MB
Available Physical Memory: 2,536 MB
Virtual Memory: Max Size: 11,410 MB
Virtual Memory: Available: 2,686 MB
Virtual Memory: In Use: 8,724 MB
난 그냥 내 노트북에서 초기화 할 수있는 배열의 최대 크기을 테스트 할 수있는 응용 프로그램을 작성합니다.
public static void BurnMemory()
{
for(var i = 1; i <= 1024; i++)
{
long size = 1 << i;
long t = 4 * size/(1 << 30);
try
{
// 1 int32 takes 32 bit(4 byte) memmory,
var arr = new int[size];
Console.WriteLine("Test pass initialize a array with size = 2^" + i.ToString());
}
catch(OutOfMemoryException err)
{
Console.WriteLine("Reach memory limitation when initialize a array with size = 2^{0} int32 = 4 x {1}B= {2}TB",i, size, t);
break;
}
}
}
크기가 2^29 인 어레이를 초기화하려고 할 때 종료되는 것처럼 보입니다.
Reach memory limitation when initialize a array with size = 2^29 int32 = 4 x 536870912B= 2TB
나는 시험에서 얻을 무엇 :
- 메모리 제한에 도달하기 어렵지 않다.
- 서버의 기능을 이해하고 메모리 내 정렬 또는 외부 정렬 사용 여부를 결정해야합니다.
- 1. Directed Acyclic Graph에서 Longest Path에 토폴로지 정렬이 필요한 이유는 무엇입니까?
- 2. 효율적으로 액세스하려면 4의 메모리 정렬이 필요한 이유는 무엇입니까?
- 3. Nginx에서 메모리 정렬이 필요한 이유
- 4. NotificationCompat가 필요한 이유는 무엇입니까?
- 5. clientID가 필요한 이유는 무엇입니까?
- 6. LINQ가 필요한 이유는 무엇입니까?
- 7. 외부 하이브 테이블의 위치에 대한 쓰기 권한이 필요한 이유는 무엇입니까?
- 8. 병합 정렬이 작동하지 않는 이유는 무엇입니까?
- 9. 내 빠른 정렬이 끊기는 이유는 무엇입니까?
- 10. 같은 파일의 전체 정렬이 실패하는 이유는 무엇입니까?
- 11. 병합 정렬이 안정되지 않은 이유는 무엇입니까?
- 12. PHP에서이 몽고 정렬이 작동하지 않는 이유는 무엇입니까?
- 13. 하이퍼 링크 정렬이 다른 이유는 무엇입니까?
- 14. 내 실행 계획에 정렬이 나타나는 이유는 무엇입니까?
- 15. 버블 정렬이 작동하지 않는 이유는 무엇입니까
- 16. Opera에서 인라인 정렬이 작동하지 않는 이유는 무엇입니까?
- 17. Django Admin에서 열 정렬이 느린 이유는 무엇입니까?
- 18. 삽입 정렬이 작동하지 않는 이유는 무엇입니까?
- 19. 정렬이 연관 배열에서 작동하는 이유는 무엇입니까?
- 20. 전달 선언이 필요한 이유는 무엇입니까?
- 21. addRequestHeader 메소드가 필요한 이유는 무엇입니까?
- 22. 번호 접미사가 필요한 이유는 무엇입니까?
- 23. 토큰 체계가 필요한 이유는 무엇입니까?
- 24. Eclipse에서 Ant가 필요한 이유는 무엇입니까?
- 25. 파이썬에서 발전기가 필요한 이유는 무엇입니까?
- 26. 긴 형식이 필요한 이유는 무엇입니까?
- 27. null 종결자가 필요한 이유는 무엇입니까?
- 28. 스토리지 할당이 필요한 이유는 무엇입니까?
- 29. 포인터에 형식이 필요한 이유는 무엇입니까?
- 30. j_spring_security_check 404가 필요한 이유는 무엇입니까?
가상 메모리가 무한하지 않습니까? –
이것은 테이프 드라이브에서 작업을 정렬하는 것과 관련이 있습니까? 나는 knuth가 그것에 대해 말할 많은 것을 듣는다. 당신의 tapedrive는 하드 드라이브보다 훨씬 클 수 있습니다. 따라서 최대 가상 메모리가됩니다. –
@Oxinabox iirc 32 비트 Windows 컴퓨터의 가상 메모리는 16TB로 제한됩니까? 그것을 다시 확인해야합니다. 두 번째 옵션은 VM을 지원하지 않는 OS입니다.세 번째로 일부 프로세스는 관리자가 제한적으로 사용할 수있는 VM을 가질 수 있습니다. –