3 回答

TA貢獻2065條經(jīng)驗 獲得超14個贊
我不知道為什么你認為你的進程應(yīng)該能夠訪問4GB。根據(jù)MSDN上Windows版本的內(nèi)存限制,在64位Windows 7上,默認的32位進程獲得2GB。*這正是它用完的地方。
那么,有沒有辦法解決這個問題呢?
好吧,你可以自定義構(gòu)建32位Python,它使用IMAGE_FILE_LARGE_ADDRESS_AWARE
標(biāo)志,重建numpy
和所有其他擴展模塊。我不能保證使用大地址識別標(biāo)志運行所有相關(guān)代碼都是安全的; 這是一個很好的機會,但除非有人已經(jīng)完成并進行了測試,“一個好機會”是任何人都可能知道的最好的機會。
或者,更明顯的是,只需使用64位Python。
物理RAM的數(shù)量完全無關(guān)緊要。你好像認為你有8GB內(nèi)存的“8GB限制”,但這不是它的工作原理。你的系統(tǒng)占用你所有的RAM 以及它需要的任何交換空間,并在應(yīng)用程序之間進行劃分; 一個應(yīng)用程序可以獲得20GB的虛擬內(nèi)存,即使在8GB的機器上也不會出現(xiàn)內(nèi)存錯誤。同時,一個32位的應(yīng)用程序無法訪問超過4GB的空間,并且操作系統(tǒng)會占用一些地址空間(默認情況下是Windows的一半),因此即使在8GB機器上也只能獲得2GB那沒有運行任何其他東西。(并不是說在現(xiàn)代操作系統(tǒng)上可能“沒有運行任何其他東西”,但你知道我的意思。)
那么,為什么這可以在您的Linux機箱上運行?
因為你的linux盒子被配置為32位進程提供3.5GB的虛擬地址空間,或者3.99GB,或者......好吧,我不能告訴你確切的數(shù)字,但是我已經(jīng)看到多年的每個發(fā)行版都已配置好了至少3.25GB。
*另請注意,您甚至沒有真正獲得2GB的數(shù)據(jù); 你的計劃。操作系統(tǒng)及其驅(qū)動程序可以訪問代碼的大部分內(nèi)容位于另一半,但有些位于您的一半,以及您加載的每個DLL以及它們需要的任何空間以及其他各種內(nèi)容。它并沒有太多,但它不是零。

TA貢獻1886條經(jīng)驗 獲得超2個贊
你實際上沒有必要在windows上編譯exe,這IMAGE_FILE_LARGE_ADDRESS_AWARE
只是圖像標(biāo)題中的一個標(biāo)志(并不是說這將得到官方支持,但是我們沒有評判;))。dll在這件事上也沒有發(fā)言權(quán),所以不管怎么說都不需要改變。

TA貢獻1780條經(jīng)驗 獲得超4個贊
我完全不知道Python或者OP所依賴的任何Python模塊是否做了這樣的事情。我認為不太可能,但我無法保證。顯然有一些原因它不是IMAGE_FILE_LARGE_ADDRESS_AWARE
開箱即用的; 我的猜測是,到目前為止,沒有一個開發(fā)人員發(fā)現(xiàn)它值得測試和/或擦除源代碼,因為如果他們真的需要超過2GB,他們只需要使用64位版本。但這只是一個猜測,這就是為什么我的回答說它很有可能會起作用,但我不能保證。
添加回答
舉報