mergesort 및 quicksort에 대한 벤치 마크를 수행하고 있습니다.GC가 OCaml에서 사용되지 않는 메모리를 해제하도록하려면 어떻게해야합니까?
Random_list.create
, Mergesort.sort_list
및 Quicksort.sort_list
을 구현했습니다. 우리는이 세 가지 기능이 올바르게 구현되었고 구현이이 질문에서 중요하지 않다고 가정 할 수 있습니다.
내가 물어보고 싶은 것은 OCaml의 GC에 관한 것입니다.. 나는 위의 코드를 실행하면
let _ =
let l = Random_list.create 10000000 in
let len1 = List.length (Mergesort.sort_list l) in
Printf.printf "mergesort done for %d elements" len1;
let len2 = List.length (Quicksort.sort_list l) in
Printf.printf "quicksort done for %d elements" len2
, 그것은 mergesort done for 10000000 elements
후 나에게 Fatal error: exception Out_of_memory
을 알려줍니다
여기 내 벤치 마크 코드입니다.
메모리가 부족합니다. 문제가 없습니다. 또한 mergesort
성공 후 출력이 Out_of_memory
발생했음을 알립니다.
I 별도로 코드와 테스트를 분할 않았다 그런 것을
:
let _ =
let l = Random_list.create 10000000 in
let len1 = List.length (Mergesort.sort_list l) in
Printf.printf "mergesort done for %d elements" len1
와는
let _ =
let l = Random_list.create 10000000 in
let len2 = List.length (Quicksort.sort_list l) in
Printf.printf "quicksort done for %d elements" len2
모두Out_of_memory
없이 잘 실행됩니다.
여기 내 질문 : 다음 퀵 머지 소트와 : 내 벤치 마크 코드에서
예, 시리얼 종류를했다.
실행하는 동안 l
의 목록과 mergesort의 목록 및 quicksort의 목록이 생성되어야합니다.
그러나 mergesort에서 만든 목록은이어야합니다. 그 목록은 그것에 대한 어떤 언급도하지 않았습니까?
퀵 정렬 전에는 원래 l
인 주요 목록이 하나뿐입니다. 맞습니까?
왜 여전히 Out_of_memory
오류가 발생합니까?
각 정렬 및 목록 생성 후에 무슨 일이 일어나는지 확인하기 위해'Gc.print_stat stdout'을 사용하는 것이 좋을 것입니다. – snf
위 제안에 +1. 또한, 탄젠트 적으로 관련되어, 메모리 소비를 더 잘 이해하기 위해 다음과 같은 작은 모듈이 유용 할 수 있습니다. http://ygrek.org.ua/p/code/measure.ml – ygrek