最適化のメモリ消費量が徐々にファイルへ書き
-
27-09-2019 - |
質問
れをやってきたということではいくつかの試験は、私のニーズからデータを読み込むための異なるxmlファイルおよびスタックで一つのファイルです。がんそのためには、メモリ消費が非常に大型のタスクは、iphoneシミュレーターなどのメモリの警告がいいかもしれませんが、実iPhoneにも耐えるこいいデバイスに挑戦してみてくださいねこさんの主機関による憶測がからんどろ風mikiモデルを作ってみます。
の主部のコードは:
Boolean success = [fileManager createFileAtPath:documentsPath contents:nil attributes:nil];
[fileManager release];
if (success) {
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:documentsPath];
for (int i = 0; i < 100; i++) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"mensagem_de_arquivo"
ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
GDataXMLDocument *xml = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
NSArray *tokens = [xml nodesForXPath:@"//message/data" error:nil];
if (tokens.count > 0) {
GDataXMLElement *token = (GDataXMLElement *)[tokens objectAtIndex:0];
[fileHandle writeData:[[token stringValue] dataUsingEncoding:NSASCIIStringEncoding]];
}
[xml release];
}
の構築と解析"コマンドを与えてくれていない漏れも、コードな警告をビルドする際も、メモリ消費がどこか間50 70mb(えるものになってライブバイト全体でほぼ倍).
のではありませんからお読みの100倍と同じファイルとしての試験データでよれば十分のコードを読取るだけでコンテンツをxmlファイルに対して送付された順序でファイルにい。
必要があります。力の一部の一時オブジェクトを前に新しいものが割り当てがんの再利用はいくつかの変数は、考えていきたいと考えこの制御下でも歓迎いたします。
編集 -だけでも少し興味深いこと思いますように単一のパーサの読み書き、そのうィGDataXML場合は、変更が必要だったため、利用KissXML,TinyXMLはlibxml-DOMは、すべて見であり、記憶したことを強調しました こちらの, なので、その実施にリリースの記憶することになる。
かまいません。:)
解決
合わせなければならないという、なかなかに簡単。
いったインスタンス化AutoReleasePoolインでのループを実行します。
このように:
for (int i = 0; i < 100; i++) {
NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
//... do everything I've done before...
[pool drain];
}
こちり物としてマークautoreleaseインスタンスを生成のためには、まだ発売後も、うまくいったと考を妨げることなく、あなたっては発売前にいたします。
メモリ消費量を落としたから、百日せきで60~80mbるようなもの1,6mbのループとして、同600kbで(ダミーのアプリを行います。
私はまだこの問題をオープンな場合には、人がより良いアイデアが、この方法:)
他のヒント
ええ、あなたはそれをすべてNSDATAに読んで、それを「2倍」し、GDATAXMLDOCUMENTのDOMに解析します。このような多くのXMLデータを使用することを期待している場合は、複数のファイルなどにループしている場合は、 代わりにSAXベースの解析を検討してください, 、ファイルをNSDATAにプリロードするのではなく、ファイルから直接ストリーミングします。そのようにして、「一時的なオブジェクトをリリース」する必要はありません。なぜなら、必要な情報を解析するだけで抽出するだけなので、あなたは「一時的なオブジェクトをリリースする」必要はありません。