我有一个程序生成一个可变数量的数据,它必须存储以后使用。 什么时候应该选择使用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 vs mmap C
- 2. 在C++中创建临时文件
- 3. C++ realloc性能vs malloc
- 4. 使用临时文件在文本文件中编辑行C
- 5. 在tmp文件夹中创建临时文件夹c语言
- 6. 在c的临时文件夹中保存excel文件#
- 7. CGI - 临时文件
- 8. autotools临时文件
- 9. JS_malloc vs malloc
- 10. XMLPad临时文件
- 11. Firefox临时文件
- 12. .Net中的临时文件
- 13. 通过“C#”清除临时Internet文件
- 14. C++:获取临时文件,跨平台
- 15. 临时文件Asp.net
- 16. 临时文件流
- 17. Android临时文件
- 18. MSMQ vs临时表转储
- 19. 临时ASP.NET文件丢失
- 20. 在Linux中创建临时文件夹
- 21. 在android中创建临时文件
- 22. 在Ruby中使用临时文件
- 23. 动态Sql VS临时表
- 24. Heroku临时文件系统和临时文件
- 25. 如何在C#中创建临时文件(用于写入)?
- 26. 在C#中的磁盘上临时写入文件
- 27. 临时表vs表变量
- 28. 蟒蛇临时文件
- 29. Spark临时文件 - snappy
- 30. 打开gzip文件在C中读取而不创建临时文件
也许你可以给我们一个更现实的描述你的程序,比如它是否需要非常快的速度,是否有望用于具有大量内存或大量磁盘空间等的系统上 – dreamlax 2010-10-07 02:44:34
你知道一旦程序终止用malloc创建的所有东西都会丢失吗? – Albinoswordfish 2010-10-07 02:44:35
@Albinoswordfish:在许多操作系统上为临时文件提供相同的服务,例如, Linux上的tmpfile()。 – 2010-10-07 03:57:20