2010-10-07 53 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用于私有数据和单个进程的生命周期。如果数据需要持续超出单个进程,请使用临时文件。