的主要原因是外部排序是數據可能比我們have.However,現在我們使用的虛擬內存的主內存大,虛擬內存將採取主內存和disk.Why之間交換的護理我們需要有外部排序呢?爲什麼我們需要外部排序?
3
A
回答
6
外部排序算法使得排序大量高效的數據(即使當數據不適合的物理RAM)的。當使用
在內存中的排序算法和虛擬內存滿足外部排序的功能要求(即,它將對數據進行排序),它不能達到的是有效的非功能性要求。一個良好的外部排序可以最大限度地減少讀取和寫入外部存儲的數據量(以及歷史上的查找時間),並且在沒有爲此設計的排序算法之上的通用虛擬內存實現將不會與設計用於儘量減少IO。
1
除了@ Anonymous的回答是外部排序是更好地爲較少的磁盤IO優化,有時使用內存中的排序和使用虛擬內存是不可行的,因爲虛擬內存空間比文件的大小。例如,如果你有一個32位的系統(還有很多這樣的系統),並且你想對一個20GB的文件進行排序,32位系統允許你有2^32〜= 4GB的虛擬地址,但是您正在嘗試分類的文件不能適應。
當64位系統仍然不常見時,這曾經是一個真正的問題,並且對於舊的32位系統和某些嵌入式設備,現在仍然是一個問題。
然而,即使對於64位系統,在以前的答案expained,外部排序算法更排序的性質進行了優化,並需要顯著較少的磁盤IO不是讓OS「照顧的事」。
0
我使用Windows,在公共線外殼,你可以運行「系統的系統」,它給了我,我的筆記本電腦的內存使用信息。
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. 爲什麼我們在這裏需要排序?
- 2. ELF文件 - 什麼是部分,爲什麼我們需要它?
- 3. DavLockDB:我們需要什麼?
- 4. 爲什麼我們需要simple_one_for_one?
- 5. 爲什麼我們需要TensorFlow tf.Graph?
- 6. 爲什麼我們需要使用prompt.start()?
- 7. 爲什麼我們需要scalaz.stream迭代?
- 8. 爲什麼我們需要WCF
- 9. 爲什麼我們需要Anaconda 2.7?
- 10. 爲什麼我們需要編寫log.isDebugEnabled?
- 11. 爲什麼我們需要ng-click?
- 12. 爲什麼我們需要Control.Lens.Reified?
- 13. 我們爲什麼需要纖維
- 14. 爲什麼我們需要org.junit.ComparisonFailure?
- 15. 爲什麼我們需要addRequestHeader方法?
- 16. 爲什麼我們需要時代?
- 17. 爲什麼我們需要ContinueWith方法?
- 18. 爲什麼我們需要Java NIO Selector?
- 19. 爲什麼我們需要使用ExitWindowsEx
- 20. 爲什麼我們需要包裝類
- 21. 爲什麼我們需要在JavaScript
- 22. 爲什麼我們需要設置SONAR_RUNNER_OPTS?
- 23. 爲什麼我們需要ioc容器
- 24. mongodb爲什麼我們需要getSisterDB
- 25. 爲什麼我們需要BeginGetResponse和BeginRead?
- 26. 爲什麼我們需要fieldset標籤?
- 27. 爲什麼我們需要boost :: thread_specific_ptr?
- 28. JSP:爲什麼我們需要RequestDispatcher?
- 29. 爲什麼我們需要calloc(或malloc)?
- 30. 爲什麼我們需要.htaccess的worpdress?
虛擬內存不是無限的將是一件事我想 – 2015-02-06 04:43:03
這是否涉及排序磁帶驅動器上的東西?我聽說knuth有很多話要說。 你的tapedrive可能比你的硬盤大很多(因此也是最大的虛擬內存) – 2015-02-06 04:44:36
@Oxinabox iirc 32位Windows機器對虛擬內存有16TB的限制嗎?需要仔細檢查一下。 第二個選項將是不支持虛擬機的操作系統。第三,一些進程可能有他們可以使用的虛擬機,這些虛擬機可以被管理員等使用。 – 2015-02-06 04:50:53