如何重用NSData来读取多个大文件?

时间:2011-06-21 17:05:20

标签: iphone objective-c memory-management

我需要阅读几十个文件并对其内容进行一些简单的处理。每个文件单独不会导致问题,但一次加载所有数据将很快耗尽我的记忆。

我开始时:

for (NSString *filename in filenames)
    do_something([NSData dataWithContentsOfFile:filename]);

然后当然,我记得iPhone上的Objective-C并不是真正的垃圾收集,而且无论如何这些都会一直存在,直到框架结束。好:

for (NSString *filename in filenames) {
    NSData *d = [[NSData alloc] initWithContentsOfFile:filename];
    do_something(d);
    [d release];
}

这名义上只使用尽可能多的内存作为最大的文件,但这只是假设分配器目前正在玩友好 - 它也可以捶打并分割所有内容。

我是否可以通过某种方式制作NSMutableData,并继续重用Data的缓冲区,并根据需要增加它?我需要它作为其他第三方API的NSData。我现在最好的想法就是在我去的时候使用char *缓冲区进行mallocing / reallocing,例如使用例如stdio,并使用freeWhenDone构建NSDatas:NO支持;这样我每个文件只会捶打/保留少量。

2 个答案:

答案 0 :(得分:2)

你正在做的是第二个例子没问题。即使您重用NSMutableData对象的容量,也需要使用文件内容创建另一个NSData对象。如果您遇到内存问题,请考虑修改do_something()以使用NSInputStreams

答案 1 :(得分:1)

您可以在第二个示例中使用-[NSData initWithContentsOfMappedFile:]来尽可能降低内存使用率。

来自文档:

  

映射文件使用虚拟内存技术来避免将文件页面复制到内存中,直到实际需要它们为止。