我需要在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导入一次),让内存使用量减少,但它对我来说似乎并不理想。
答案 0 :(得分:1)
我的应用程序中也遇到了内存利用率相同的问题,因为它达到600 MB,然后我使用自动释放池手动释放内存。
for(int i = 0; i < 200; i++)
{
NSData *theData = [self generateRandomData];
@autoreleasepool {
const char *buf = ((NSData*)theData).bytes;
}
}
创建一个自动释放池,然后检查你的内存利用率。希望这可以帮助你。