我有一個程序生成一個可變數量的數據,它必須存儲以後使用。 什麼時候應該選擇使用mallod + realloc,何時應該選擇使用臨時文件?臨時文件vs malloc(在C中)
回答
如果數據的大小大於目標系統的虛擬地址空間大小(32位主機上的2-3 GB),或者它至少大到會導致嚴重的資源緊張,請使用臨時文件在系統上。
否則使用malloc
。
如果你走臨時文件的路徑,使用tmpfile
函數來創建它們,因爲在良好的系統中,它們永遠不會在文件系統中有名稱,並且如果程序異常終止,則不會有機會留下來。大多數人不喜歡像微軟Office產品那樣的臨時文件夾,往往會留下來。 ;-)
mmap(2,3p)
(或file mappings)表示無需在兩者之間進行選擇。
在現代操作系統中,如果需要的話,所有內存都會被分頁到磁盤,所以請儘量將malloc()任意設置爲幾千兆字節。
請參閱[vy32](http://stackoverflow.com/questions/3878310#3878376)的評論 – rwong 2010-10-07 04:44:08
如果您需要/希望它對其他進程可見,則優先選擇一個臨時文件,如果不是,請使用malloc/realloc。還要考慮與您的地址空間和虛擬內存相比的數據量:如果數據保留在內存中,數據是否會消耗太多的交換空間?還要考慮各自的用法對您的應用程序有多好:文件讀/寫等與內存訪問相比可能是一種痛苦...內存映射文件使其更容易,但您可能需要自定義庫支持來進行動態內存分配在他們之內。
如果你知道的最大尺寸,它不是太大,你只需要一個副本,你應該使用一個靜態緩衝區,在程序加載時間分配:
char buffer[1000];
int buffSizeUsed;
如果任何該等先決條件是假的,你只需要在程序運行時的信息,使用malloc
:
char *buffer = malloc (actualSize);
只要確保你檢查分配工作,你免費不管你分配。
如果信息必須在您的程序終止後仍然存在,或者可以在其他程序中同時使用,那麼它需要進入文件(如果您具有該功能,則需要長時間共享內存)。
而且,如果它太大而無法一次裝入您的地址空間,則需要將其存儲在一個文件中並一次讀取一次。
這基本上是從最簡單/最不靈活到最難/最靈活的可能性。
如果您的要求與此相符,您需要做出決定。
在32位系統上,您將無法使用超過2GB或3GB左右的malloc()。文件的一大優點是它們僅受磁盤大小的限制。即使使用64位系統,分配超過8GB或16GB的數據也是不常見的,因爲通常會限制交換文件的大小。
一些較舊的文件系統對文件大小也有限制,但沒有人再使用它們,或者它們是否......? :-) – 2010-10-08 10:20:33
我希望他們沒有。 – vy32 2010-10-10 01:17:52
將ram用於私有數據和單個進程的生命週期。如果數據需要持續超出單個進程,請使用臨時文件。
- 1. malloc C++ VS 2013
- 2. malloc vs mmap C
- 3. C中的臨時文件
- 4. realloc vs malloc in C
- 5. 在C++中創建臨時文件
- 6. 「臨時Internet文件」文件夾vs「Content.IE5」子文件夾
- 7. 數組c的malloc()VS {}
- 8. C++ realloc性能vs malloc
- 9. 在C#中的臨時文件夾中刪除文件
- 10. 使用臨時文件在文本文件中編輯行C
- 11. 在c的臨時文件夾中保存excel文件#
- 12. 在tmp文件夾中創建臨時文件夾c語言
- 13. 臨時ASP.NET文件
- 14. CGI - 臨時文件
- 15. autotools臨時文件
- 16. 在臨時文件夾中顯示臨時文件到圖像控件
- 17. C:由malloc函數產生的自由臨時數組
- 18. Static vs New/Malloc
- 19. 數組vs malloc?
- 20. JS_malloc vs malloc
- 21. 在C++中臨時克隆?
- 22. XMLPad臨時文件
- 23. Firefox臨時文件
- 24. .Net中的臨時文件
- 25. C++:獲取臨時文件,跨平臺
- 26. C# - 如何刪除臨時Internet文件
- 27. 通過「C#」清除臨時Internet文件
- 28. 自動刪除臨時文件(C#)
- 29. 臨時文件Asp.net
- 30. 臨時文件流
也許你可以給我們一個更現實的描述你的程序,比如它是否需要非常快的速度,是否有望用於具有大量內存或大量磁盤空間等的系統上 – dreamlax 2010-10-07 02:44:34
你知道一旦程序終止用malloc創建的所有東西都會丟失嗎? – Albinoswordfish 2010-10-07 02:44:35
@Albinoswordfish:在許多操作系統上爲臨時文件提供相同的服務,例如, Linux上的tmpfile()。 – 2010-10-07 03:57:20