Re: [問題] 記憶體空間配置
※ 引述《halajohn (Wei Hu)》之銘言:
: ※ 引述《Arton0306 (沒有怎麼辦)》之銘言:
: : 請問有辦法得知目前可配置多少記憶體嗎?
: : (XP和Linux的 因為我寫的會在兩系統下跑)
: : 或者是當我不斷加東西在vector中時
: : 可以測知我不能再加了
: : 然後我呼叫另一個函數
: : 因為我現在要處理一個很大的檔案
: : 想配合現在可用的記憶體多寡來
: : new一塊記憶體
: 在 xp 或 linux 這種階層眾多的 OS 下,
: 要偵測出 memory allocation failure 不是很切實際的事情.
: 而每個 process 理論上所能使用的 memory size 也差不多在 GB 級以上
: (依據作業系統 kernel 的設定會有所不同)
: 所以你的第一個問題幾乎沒法做到. 至少沒法單純用 user space api 來做到.
: 第二個問題, 如果你今天要處理一個很大的檔案,
: 我會建議你用 mmap 來做.
與其看系統目前可配置多少記憶體,倒不如討論定址空間。因為可用記憶體隨時在變。
不過,在系統能力許可下,作業系統會儘量分配記憶體給程式用。但不保證你分到的
記憶體真的在RAM裡面。(swap out to swap file)
這兩個系統(以32bit系統),定址空間都是4GB。
核心模式部份,win32吃掉2GB(0x80000000~0xFFFFFFFF),NULL陳述區用掉64KB
(0x00000000~0x0000FFFF),再扣掉64KB禁區(0x7FFF0000~0x7FFFFFFF),總共是
2GB-128KB的使用者模式可用區(0x00010000~0x7FFEFFFF)。
雖然不能回答你的問題,但至少回答了系統可以分配的最大記憶體空間。
至於linux怎麼作的,我也很想知道。
要處理大檔案,用memory mapping file的確是好作法。
這位大大回答了"mmap"--po6 system下的解決方案。win32下的則是CreateFile,
CreateFileMapping及MapViewOfFile三個函數的trinity。
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.166.202.127
※ 編輯: ccbruce 來自: 218.166.202.127 (03/25 00:23)
※ 編輯: ccbruce 來自: 218.166.202.127 (03/25 01:27)
→
03/25 03:08, , 1F
03/25 03:08, 1F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章