Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos can';I don’我的4GB内存中,用于简单排序的内存不能超过1.5GB_Macos_Sorting_Performance Testing_Virtual Memory_Swapfile - Fatal编程技术网

Macos can';I don’我的4GB内存中,用于简单排序的内存不能超过1.5GB

Macos can';I don’我的4GB内存中,用于简单排序的内存不能超过1.5GB,macos,sorting,performance-testing,virtual-memory,swapfile,Macos,Sorting,Performance Testing,Virtual Memory,Swapfile,我使用的是大约2007年夏天的MacBookPro(x86-64),它有32KB的L1(我想)、4MB的L2和4GB的RAM;我正在运行OSX10.6.8 我正在用C++编写一个标准的基数排序:它从一个数组复制到另一个数组,然后在排序时再复制回来(因此使用的内存是数组大小的两倍)。我通过打印“.”来观看,每移动一百万个条目 如果阵列最大为750MB,那么这些点通常移动得相当快;但是,如果数组较大,则整个过程将停止。如果我按块对512 MB进行基数排序,然后尝试合并对块进行排序,则第一个块会快速移

我使用的是大约2007年夏天的MacBookPro(x86-64),它有32KB的L1(我想)、4MB的L2和4GB的RAM;我正在运行OSX10.6.8

我正在用C++编写一个标准的基数排序:它从一个数组复制到另一个数组,然后在排序时再复制回来(因此使用的内存是数组大小的两倍)。我通过打印“.”来观看,每移动一百万个条目

如果阵列最大为750MB,那么这些点通常移动得相当快;但是,如果数组较大,则整个过程将停止。如果我按块对512 MB进行基数排序,然后尝试合并对块进行排序,则第一个块会快速移动,然后进程会再次爬行停止。也就是说,我的进程似乎只能使用1.5 GB的RAM进行排序。奇怪的是我有4GB的物理RAM

我试着分配一个8GB的数组,然后遍历它,每写入一个字节,然后每百万字节打印一个“.”;似乎所有东西都开始在1.5GB左右减速,甚至在超过4GB的情况下都保持在这个速度,而我知道它一定会进入磁盘;因此,操作系统开始将页面写入1.5GB左右的磁盘


我想用我的机器对大型阵列进行排序。我如何告诉我的操作系统给我的进程提供至少3.5 GB的RAM?我尝试过使用mlock(),但这似乎会让事情变得更慢。想法?

操作系统可能会在每个地址中保留一点来区分用户空间和内核空间,因此在调用虚拟内存之前,用户进程不可能使用超过2 GB的4 GB内存;当然不是虚拟地址,因为我已经将大于2**32的巨大数组malloc,并且我已经编写了一个循环来通过大于2**32的数组进行写入,但是一旦超过1.5 GB左右,它就会变得相当慢,因为我实际上是直接写入磁盘;对于物理地址,如果它是一台64位机器,可以在虚拟空间中为用户提供64位,那么在物理空间中只使用32位地址又有什么意义呢?问题显然是内核不希望一个进程使用超过1.5 GB的物理RAM;我只是想知道如何让它放弃那个限制