- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
语境
遍历一组已加载,分析(通过XML功能)然后再次从内存中删除的Rdata文件(每个文件都包含HTML代码的字符向量)时,我发现
R进程的内存消耗(最终杀死进程)。
好像
通过free()
释放对象,
通过rm()
删除它们,然后
正在运行gc()
不会有任何影响,因此直到不再有可用的内存为止,内存消耗才会累积。
编辑2012-02-13 23:30:00
得益于软件包XML的作者和维护者Duncan Temple Lang的宝贵见解(再次,我非常感谢!),该问题似乎与释放外部指针的方式以及如何进行垃圾回收紧密相关。在XML包中处理。 Duncan发布了该程序包的一个错误修复版本(3.92-0),该版本合并了解析XML和HTML的某些方面,并具有改进的垃圾回收功能,不再需要通过free()
显式释放包含外部指针的对象。您可以在Duncan的Omegahat website中找到源代码和Windows二进制文件。
编辑2012-02-13 23:34:00
不幸的是,新的软件包版本似乎仍无法解决我整理的一个小示例中遇到的问题。我遵循了一些建议,并简化了示例,使其更易于掌握和查找出现问题的相关功能(检查功能./lib/exampleRun.R
和.lib/scrape.R
)。
编辑2012-02-14 15:00:00
邓肯建议尝试通过.Call("RS_XML_forceFreeDoc", html)
显式释放解析的文档。我在示例中包含了一个逻辑开关(脚本do.forcefree
中的./scripts/memory.R
),如果将其设置为TRUE
,它将执行此操作。不幸的是,这使我的R控制台崩溃了。如果有人可以在他们的计算机上验证这一点,那就太好了!实际上,使用最新版本的XML(请参见上文)时,应自动释放文档。事实并非如此(根据Duncan的说法)。
编辑2012-02-14 23:12:00
Duncan将另一个XML(3.92-1)版本推到了他的Omegahat网站Omegahat website。总体而言,这应该可以解决该问题。但是,我的示例似乎不走运,因为我仍然遇到相同的内存泄漏。
EDIT 2012-02-17 20:39:00>解决方案!
是! Duncan发现并修复了该错误!这是纯Windows脚本中的一个小错字,它解释了为什么该错误未在Linux,Mac OS等操作系统中显示。请查看最新版本3.92-2.!现在,内存消耗与迭代解析和处理XML文件时一样恒定!
再次特别感谢Duncan Temple Lang,并感谢其他回答此问题的人!
>>>原始问题的旧部分<<<
示例说明(于2012-02-14 15:00:00编辑)
从我的Github repo下载文件夹“ memory”。
打开脚本./scripts/memory.R
并在第6行设置a)您的工作目录,b)在第16行也设置示例范围c)是否在第22行是否强制释放已解析的文档。请注意,您仍然可以找到旧的脚本;它们在文件名的末尾用“ LEGACY”“标记”。
运行脚本。
研究最新文件./memory_<TIMESTAMP>.txt
以查看记录的内存状态随时间的增加。我包括了两个文本文件,这些文件是我自己的测试运行产生的。
我在内存控制方面所做的事情
确保在每次迭代结束时通过rm()
再次删除加载的对象。
解析XML文件时,我设置了参数addFinalizer=TRUE
,在通过free()
释放C指针并删除包含外部指针的对象之前,删除了对已解析的XML文档有引用的所有R对象。
在此添加gc()
。
在使用XML包时尝试遵循Duncan Temple Lang的notes中有关内存管理的建议(我必须承认,尽管我没有完全理解那里的内容)
编辑2012-02-13 23:42:00:
正如我在上面指出的那样,不再需要先显式调用free()
,然后再调用rm()
,因此我将这些调用注释掉了。
系统信息
Windows XP 32位,4 GB RAM
Windows 7 32位,2 GB RAM
Windows 7 64位,4 GB RAM
R 2.14.1
XML 3.9-4
XML 3.92-0(在http://www.omegahat.org/RSXML/中找到)
截至2012-02-09 01:00:00的初步发现
在大约180-350次迭代(取决于OS和RAM)之后,在多台机器上运行webscraping方案(请参阅上面的“系统信息”一节)总是会破坏我的R进程的内存消耗。
当且仅当在每次迭代中通过gc()
设置对垃圾收集器的显式调用时,运行普通rdata方案才会产生恒定的内存消耗。否则,您会遇到与网络抓取场景相同的行为。
问题
知道导致内存增加的原因是什么?
任何想法如何解决这个问题?
截至2012-02-013 23:44:00的发现
在大约180-350次迭代(取决于OS和RAM)之后,在多台计算机上的./scripts/memory.R
中运行示例(请参见上面的“系统信息”一节)仍然会破坏我的R进程的内存消耗。
内存消耗仍然有明显的增加,尽管仅看数字似乎并没有那么多,但由于这个原因,我的R进程总是在某个时候终止。
下面,我发布了一些时间序列,这些时间序列是在具有2 GB RAM的WinXP 32位盒上运行示例后得出的:
TS_1(XML 3.9-4,2012-02-09)
29.07
33.32
30.55
35.32
30.76
30.94
31.13
31.33
35.44
32.34
33.21
32.18
35.46
35.73
35.76
35.68
35.84
35.6
33.49
33.58
33.71
33.82
33.91
34.04
34.15
34.23
37.85
34.68
34.88
35.05
35.2
35.4
35.52
35.66
35.81
35.91
38.08
36.2
TS_2(XML 3.9-4,2012-02-09)
28.54
30.13
32.95
30.33
30.43
30.54
35.81
30.99
32.78
31.37
31.56
35.22
31.99
32.22
32.55
32.66
32.84
35.32
33.59
33.32
33.47
33.58
33.69
33.76
33.87
35.5
35.52
34.24
37.67
34.75
34.92
35.1
37.97
35.43
35.57
35.7
38.12
35.98
与TS_2相关的错误消息
[...]
Scraping html page 30 of ~/data/rdata/132.rdata
Scraping html page 31 of ~/data/rdata/132.rdata
error : Memory allocation failed : growing buffer
error : Memory allocation failed : growing buffer
I/O error : write error
Scraping html page 32 of ~/data/rdata/132.rdata
Fehler in htmlTreeParse(file = obj[x.html], useInternalNodes = TRUE, addFinalizer = TRUE):
error in creating parser for (null)
> Synch18832464393836
[...]
---------- status: 31.33 % ----------
Scraping html page 1 of 50
Scraping html page 2 of 50
[...]
Scraping html page 36 of 50
Scraping html page 37 of 50
Fehler: 1: Memory allocation failed : growing buffer
2: Memory allocation failed : growing buffer
seed.Rdata
。
scrape.R
。
setwd("set/path/to/your/wd")
install.packages("XML", repos="http://www.omegahat.org/R")
library(XML)
source("scrape.R")
load("seed.rdata")
html <- htmlParse(obj[1], asText = TRUE)
counter.1 <- .Call("R_getXMLRefCount", html)
print(counter.1)
z <- scrape(html)
gc()
gc()
counter.2 <- .Call("R_getXMLRefCount", html)
print(counter.2)
rm(html)
gc()
gc()
counter.1
和
counter.2
的值特别感兴趣,这两个调用中的值均应为
1
。实际上,邓肯已经在所有机器上对其进行了测试。但是,事实证明
counter.2
在我所有的机器上都具有值
259
(请参见上面的详细信息),这正是导致我的问题的原因。
最佳答案
在XML
包的网页上,作者Duncan Temple Lang似乎已经相当广泛地描述了某些内存管理问题。参见本页:"Memory Management in the XML Package"。
老实说,我不精通代码和程序包的详细信息,但我想您可以在该页面(特别是"Problems"部分)找到答案,或者直接与邓肯神庙郎。
更新1.更新的一种可行方法是使用multicore
和foreach
软件包(即listResults = foreach(ix = 1:N) %dopar% {your processing;return(listElement)}
。我认为对于Windows,您将需要doSMP
或doRedis
;在Linux下,我使用doMC
。无论如何,通过并行化加载,您将获得更快的吞吐量,我认为您可以从内存使用中获得一些好处的原因是,叉R可能导致不同的内存清理,因为每次产生的进程在完成时会被杀死,虽然不能保证正常工作,但可以解决内存和速度问题。
不过请注意:doSMP
有其自身的特质(即,您可能仍会遇到一些内存问题)。关于SO的其他问答也提到了一些问题,但我还是会尝试一下。
关于r - 迭代解析XML文件时出现严重的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220849/
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!