返回列表 回覆 發文

如何寫百M以上的檔案?

各位好,我現有一個程式可以從網路上load資料,而且資料量不小,會有100MB以上,我現在用NSFileManage產生一個檔案後,再用NSFileHandle將後續載下來的資料加在後面,我是每10M寫一次,發現到只要寫超過30m系統就會再立刻alloc 30M,直到最後記憶體不足,就掛了,當我再去查看file時,己經有掛掉之前寫的部分在還存在,我應該要怎麼做才可以將己經寫入的記憶體釋放?要不然都無法寫大的file?以下是我的code,請各位幫幫忙!
  1. if([[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath:@"Test"]]==NO)
  2.                                                 {
  3.                                                         [[NSFileManager defaultManager] createFileAtPath:[self dataFilePath:@"Test" ] contents:[NSData dataWithBytes:WriteFileBuf length:tlv->value] attributes:nil];
  4.                                                 }
  5.                                                 else
  6.                                                 {
  7.                                                         NSFileHandle *file = [NSFileHandle fileHandleForUpdatingAtPath:[self dataFilePath:@"Test"]];
  8.                                                         [file seekToEndOfFile];
  9.                                                         [file writeData:[NSData dataWithBytes:WriteFileBuf length:tlv->value]];
  10.                                                         [file synchronizeFile];
  11.                                                         [file closeFile];
  12.                                                         file = nil;
  13.                                                 }
複製代碼
[會心一笑]:
iPhone的記憶體運作空間應該沒那麼大,或許試試看每1MB寫入一次。
[會心一笑]:
基本上iPhone上完它自已的os之后可用的空間也差不多剩30M~40M的空間,(雖然有清空間的軟體號稱可以弄出70M的空間),不過我一般還是以10M為最大的基準點,所以我建議別一次下滿,因為讓OS有空間去處理它本身的記憶體的需求。
嗯~這麼說好了,
建議你自己處理alloc/free,不要讓autorelease pool幫你,
不然你用多少自己沒辦法掌握
[會心一笑]:
本帖最後由 cjlin 於 2010-3-12 10:14 編輯

嗯~這麼說好了,
建議你自己處理alloc/release,不要讓autorelease pool幫你,
不然你用多少自己沒辦法掌握

簡單來說,就是把dataWithBytes換成initWithBytes,然後用完馬上release
[會心一笑]:
感謝各位的回答,問題就在autorelease pool,我那段code是寫在NSThread裡,如果是自己aloooc/release就沒問題,要不然就要呼叫[pool drain];然後再pool = [[NSAutoreleasePool alloc] init],才會清掉。
[會心一笑]:
返回列表