2010-10-07 26 views
1

我有一個程序生成一個可變數量的數據,它必須存儲以後使用。 什麼時候應該選擇使用mallod + realloc,何時應該選擇使用臨時文件?臨時文件vs malloc(在C中)

+2

也許你可以給我們一個更現實的描述你的程序,比如它是否需要非常快的速度,是否有望用於具有大量內存或大量磁盤空間等的系統上 – dreamlax 2010-10-07 02:44:34

+5

你知道一旦程序終止用malloc創建的所有東西都會丟失嗎? – Albinoswordfish 2010-10-07 02:44:35

+1

@Albinoswordfish:在許多操作系統上爲臨時文件提供相同的服務,例如, Linux上的tmpfile()。 – 2010-10-07 03:57:20

回答

1

如果數據的大小大於目標系統的虛擬地址空間大小(32位主機上的2-3 GB),或者它至少大到會導致嚴重的資源緊張,請使用臨時文件在系統上。

否則使用malloc

如果你走臨時文件的路徑,使用tmpfile函數來創建它們,因爲在良好的系統中,它們永遠不會在文件系統中有名稱,並且如果程序異常終止,則不會有機會留下來。大多數人不喜歡像微軟Office產品那樣的臨時文件夾,往往會留下來。 ;-)

+2

MSO臨時文件用於崩潰恢復。這是BSOD之後的第二個最重要的安全功能。 – rwong 2010-10-07 04:46:19

+0

@rwong:+1,哈哈哈。 – Behrooz 2010-10-07 05:05:10

6

mmap(2,3p)(或file mappings)表示無需在兩者之間進行選擇。

0

在現代操作系統中,如果需要的話,所有內存都會被分頁到磁盤,所以請儘量將malloc()任意設置爲幾千兆字節。

+0

請參閱[vy32](http://stackoverflow.com/questions/3878310#3878376)的評論 – rwong 2010-10-07 04:44:08

1

如果您需要/希望它對其他進程可見,則優先選擇一個臨時文件,如果不是,請使用malloc/realloc。還要考慮與您的地址空間和虛擬內存相比的數據量:如果數據保留在內存中,數據是否會消耗太多的交換空間?還要考慮各自的用法對您的應用程序有多好:文件讀/寫等與內存訪問相比可能是一種痛苦...內存映射文件使其更容易,但您可能需要自定義庫支持來進行動態內存分配在他們之內。

0

如果你知道的最大尺寸,它不是太大,你只需要一個副本,你應該使用一個靜態緩衝區,在程序加載時間分配:

char buffer[1000]; 
int buffSizeUsed; 

如果任何該等先決條件是假的,你只需要在程序運行時的信息,使用malloc

char *buffer = malloc (actualSize); 

只要確保你檢查分配工作,你免費不管你分配。

如果信息必須在您的程序終止後仍然存在,或者可以在其他程序中同時使用,那麼它需要進入文件(如果您具有該功能,則需要長時間共享內存)。

而且,如果它太大而無法一次裝入您的地址空間,則需要將其存儲在一個文件中並一次讀取一次。

這基本上是從最簡單/最不靈活到最難/最靈活的可能性。

如果您的要求與此相符,您需要做出決定。

0

在32位系統上,您將無法使用超過2GB或3GB左右的malloc()。文件的一大優點是它們僅受磁盤大小的限制。即使使用64位系統,分配超過8GB或16GB的數據也是不常見的,因爲通常會限制交換文件的大小。

+0

一些較舊的文件系統對文件大小也有限制,但沒有人再使用它們,或者它們是否......? :-) – 2010-10-08 10:20:33

+0

我希望他們沒有。 – vy32 2010-10-10 01:17:52

0

將ram用於私有數據和單個進程的生命週期。如果數據需要持續超出單個進程,請使用臨時文件。