- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
读取大型 XML 文件(几 GB)时,Swift 程序不断消耗内存,直到我的整个系统崩溃。不好。在四处挖掘并删除所有有用的代码之后,下面的代码仍然存在。它只定义了一个 NSXMLParserDelegate
,在其上实现了一种协议(protocol)方法。现在,当针对 17 MB 的相对较小的 XML 文件运行时,总分配量将达到 47 MB,脏内存占 77 MB。现在这让我觉得很奇怪,因为我的代码没有引用它传递的任何数据。
这是 NSXMLParser 的错误、我的误解还是我的代码错误?
import Foundation
var input = NSURL(fileURLWithPath: Process.arguments[1])!
class MyDelegate: NSObject, NSXMLParserDelegate {
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: NSDictionary) {
}
}
var parser = NSXMLParser(contentsOfURL: input)!
var delegate = MyDelegate()
parser.delegate = delegate
parser.parse()
文档
Memory management becomes a heightened concern when you are parsing XML. Processing the XML often requires you to create many objects; you should not allow these objects to accumulate in memory past their span of usefulness. One technique for dealing with these generated objects is for the delegate to create a local autorelease pools at the beginning of each implemented delegation method and release the autorelease pool just before returning. NSXMLParser manages the memory for each object it creates and sends to the delegate. (source)
更新
当直接使用 libxml2 的 sax 解析器时,内存使用量在几秒钟后保持稳定,使用量约为 100 MB。为什么 NSXMLParser(主要只是一个包装器)使用这么多内存?
更新 2
NSXMLParser 不应在代理处理完数据后保留数据。大多数由 NSXMLParser 分配的结构的引用计数为 1(见屏幕截图),因此保持分配状态。手动释放内存有帮助,但这与文档中的内存声明相矛盾并且感觉不对。
最佳答案
根据实验,我认为 NSXMLParser
确实使用了全局 autoreleasepool
。所以 autoreleasepool
只管理整个解析事件,而不是对委托(delegate)的单独回调。因此在解析文件时内存压力会增加,只有在解析完整个文件后才会释放内存压力。
伪代码:
Call function parse
@autoreleasepool {
Call delegate function with NSDictionary {
Bridge NSDictionary to Swift dictionary
Call my Swift delegate with Swift dictionary {
// my code
}
}
}
}
因此,NSDictionary
和桥接的 Swift 字典都保留在堆上,直到解析函数完成。为了减少内存压力,不要使用 Swift 委托(delegate),因此堆上没有 Swift 字典。或者,远离 NSXMLParser
并实现 libxml 的 sax 解析器并包含更多 autoreleasepool
。
关于objective-c - NSXMLParser 不释放分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26514909/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!