ios:读取大文件时的内存使用情况

时间:2016-11-21 09:58:17

标签: ios objective-c memory

我需要在iOS应用中导入一些文件并将数据转发到另一层(通过MessagePack)。

导入的文件可能非常大,因此我无法将其完全加载到内存中,我必须通过块读取和转发它。 为此,我使用NSInputStream,每次它给我一些数据,我打包并转发它。 但奇怪的是,这样做并不会改变进程的内存使用情况,就好像数据块是立即释放的那样。

这个过程可以通过这段代码进行模拟,在那里我创建随机数据并提取其字节(这是使用内存的MessagePack打包的主要部分):

for(int i = 0; i < 200; i++) {
    NSData *theData = [self generateRandomData];
    const char *buf = ((NSData*)theData).bytes;
}

内存使用量猛增,达到~450MB(generateRandomData创建了2MB的数据),然后在for循环结束后降低到常规级别。

我原本认为buf变量应该在每次循环迭代后释放,因此内存使用量永远不会很高。

为什么不是这样?我错过了什么吗?

我怎么能导入这样的大文件呢?我想在这个过程中做一个短暂的休息(每100MB导入一次),让内存使用量减少,但它对我来说似乎并不理想。

1 个答案:

答案 0 :(得分:1)

我的应用程序中也遇到了内存利用率相同的问题,因为它达到600 MB,然后我使用自动释放池手动释放内存。

    for(int i = 0; i < 200; i++) 
            {
            NSData *theData = [self generateRandomData];

@autoreleasepool {       
     const char *buf = ((NSData*)theData).bytes;
             }    

         }

创建一个自动释放池,然后检查你的内存利用率。希望这可以帮助你。

相关问题