在本文中,我们将详细介绍对大型XML文件使用PythonIterparse的各个方面,并为您提供关于xml文件大于等于怎么写的相关解答,同时,我们也将为您带来关于elixir–使用xmerl读取大型X
在本文中,我们将详细介绍对大型XML文件使用Python Iterparse的各个方面,并为您提供关于xml文件大于等于怎么写的相关解答,同时,我们也将为您带来关于elixir – 使用xmerl读取大型XML文件会导致节点崩溃、iphone NSXMLParser解析xml文件、perl – 使用XML :: TWIG进行大型xml文件解析失败、python – 在不使用DOM方法的情况下迭代解析大型XML文件的有用知识。
本文目录一览:- 对大型XML文件使用Python Iterparse(xml文件大于等于怎么写)
- elixir – 使用xmerl读取大型XML文件会导致节点崩溃
- iphone NSXMLParser解析xml文件
- perl – 使用XML :: TWIG进行大型xml文件解析失败
- python – 在不使用DOM方法的情况下迭代解析大型XML文件
对大型XML文件使用Python Iterparse(xml文件大于等于怎么写)
我需要用Python编写一个解析器,该解析器可以在没有太多内存(只有2GB)的计算机上处理一些非常大的文件(> 2GB)。我想在lxml中使用iterparse做到这一点。
我的文件格式为:
<item>
<title>Item 1</title>
<desc>Description 1</desc>
</item>
<item>
<title>Item 2</title>
<desc>Description 2</desc>
</item>
到目前为止,我的解决方案是:
from lxml import etree
context = etree.iterparse( MYFILE,tag='item' )
for event,elem in context :
print elem.xpath( 'description/text( )' )
del context
但是,不幸的是,此解决方案仍在消耗大量内存。我认为问题在于,在与每个“
ITEM”打交道之后,我需要做一些清理空孩子的事情。在处理完数据以进行适当清理之后,谁能提供一些建议以解决我的问题?
elixir – 使用xmerl读取大型XML文件会导致节点崩溃
defmodule Pages do def start_link(filename) do pid = spawn_link(__MODULE__,:loop,[filename]) Process.register(pid,:pages) pid end def next(xml_parser) do send(xml_parser,{:get_next,self()}) receive do {:next_page,page} -> page end end def loop(filename) do :xmerl_sax_parser.file(filename,event_fun: &event_fun/3,event_state: :top) loop_done end defp loop_done do receive do {:get_next,from} -> send(from,{:next_page,nil}) end loop_done end defp event_fun({:startElement,_,''page'',_},:top) do :page end defp event_fun({:startElement,''text'',:page) do :text end defp event_fun({:characters,chars},:text) do s = List.to_string(chars) receive do {:get_next,s}) end :text end defp event_fun({:endElement,:text) do :page end defp event_fun({:endElement,:page) do :top end defp event_fun({:endDocument},state) do receive do {:get_next,{:done}) end state end defp event_fun(_,state) do state end end
由于代码使用SAX解析器,我希望内存占用空间不变.当我尝试使用时首先阅读2000页
Enum.each(1..2000,fn(x) -> Pages.next(Process.whereis(:pages)); end)
:pages进程根据:observer.start()使用1,1 GB的内存.当我尝试读取10000页时,整个事情崩溃了:
Crash dump is being written to: erl_crash.dump...done eheap_alloc: Cannot allocate 5668310376 bytes of memory (of type "heap").
当我使用dump viewer打开erl_crash.dump时,我看到以下内容:
上面的代码有问题吗? GC不够快吗?虽然我可以看到每个进程的内存但它并没有告诉我很多.我怎么能看到这个记忆实际上去了哪里?
附:以下是今天崩溃转储的链接:https://ufile.io/becba.
原子数为14490,MsgQ为2表示:pages,0表示所有其他进程.
解决方法
此外,尝试Elixir下面的代码失败只是一个“堆栈粉碎错误”.
Enum.each(1..2000000,fn (x) -> x |> Integer.to_string |> String.to_atom end)
但是如果我用环境变量ELIXIR_ERL_OPTIONS =“t 5000000”将原子限制提高到500万,那么问题就会消失.
iphone NSXMLParser解析xml文件
首先,如果要解析xml文件,要实现NSXMLParserDelegate协议
noteXml.h文件
#import <Foundation/Foundation.h> @class NotePad; @class NoteDb; @interface NoteXml : NSObject<NSXMLParserDelegate>{ NoteDb *noteDb; NotePad *newNote; //文本节点的内容 NSMutableString *temString; //判断xml是否解析完成 BOOL isXml; } @property(nonatomic,assign)BOOL isXml; @property(nonatomic,retain) NoteDb *noteDb; @property(nonatomic,retain) NotePad *newNote; @property(nonatomic,retain) NSMutableString *temString; -(void)parserNote:(NSData*)_data; @end
noteXml.m文件
#import "NoteXml.h" #import "NoteDb.h" #import "NotePad.h" @implementation NoteXml @synthesize noteDb,newNote,temString,isXml; - (id)init { self = [super init]; if (!self) { [self release]; return nil; } isXml=NO; noteDb=[[NoteDb alloc]init]; newNote=[[NotePad alloc]init]; temString=[[NSMutableString alloc]init]; return self; } -(void)parserNote:(NSData*)_data{ //NSXMLParser 实现的是sax方法解析xml文件。 //设置xml数据,通过NSData创建解析器,还可以通过NSURL创建解析器 NSXMLParser *parser=[[NSXMLParser alloc]initWithData:_data]; //回调,代理,委托 parser.delegate=self; //运行解析器 [parser parse]; } //文档开始时处理函数 -(void)parserDidStartDocument:(NSXMLParser *)parser{ [noteDb removeAllNotes]; [temString setString:@""]; } //发现元素开始符的处理函数 (即报告元素的开始以及元素的属性) -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ if ([elementName isEqualToString:@"Note"]) { self.newNote=nil; self.newNote=[[[NotePad alloc]init]autorelease]; } [temString setString:@""]; } //处理标签包含内容字符 (报告元素的所有或部分内容) -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ if (![string isEqualToString:@""]) { [temString appendString:string]; } } //发现元素结束符的处理函数,保存元素各项目数据(即报告元素的结束标记) -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqualToString:@"Note"]) { [self.noteDb addNote:newNote]; }else if([elementName isEqualToString:@"theme"]){ newNote.theme=[NSMutableString stringWithString:self.temString]; }else if([elementName isEqualToString:@"information"]){ newNote.information=[NSMutableString stringWithString:self.temString]; }else if([elementName isEqualToString:@"date"]){ newNote.ndate=[NSMutableString stringWithString:self.temString]; }else if([elementName isEqualToString:@"priority"]){ NSInteger value=[self.temString integerValue]; newNote.priority=value; } } //文档结束 -(void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"%@",self.noteDb); self.isXml=YES; } - (void)dealloc { [noteDb release]; [newNote release]; [temString release]; [super dealloc]; } @end
ok!本博客是我自己的练习,有好多地方没有讲太清楚,还请谅解!
原文链接: http://blog.csdn.net/rhljiayou/article/details/7616618
perl – 使用XML :: TWIG进行大型xml文件解析失败
perl.exe - Application Error: The instruction at "0x28086920" referenced memory at "0x00000004". The memory Could not be "written"...
我读到XML :: Twig解析大型xml文件没有任何问题,但在我的情况下,它失败并出现上述错误.
我的.pl文件有一个forloop代码,可以旋转100,000次,如下所示:
foreach my $d1(@detailData) { if ($d1->first_child('a')->getElementsByTagName('b')) { $id= $d1->first_child('a')->first_child('x')->field('b'); } .... ..... ...... }
在forloop里面我有大约20个如果循环如上.它是否导致内存问题?
任何人都可以建议我如何克服这些记忆问题?
解决方法
对于XML :: Twig来处理大文件,您需要告诉它在哪个级别处理文件的各个部分(通常通过定义处理子树的处理程序,然后丢弃它),请参阅模块的文档.
python – 在不使用DOM方法的情况下迭代解析大型XML文件
我有一个xml文件
<temp>
<email id="1" Body="abc"/>
<email id="2" Body="fre"/>
.
.
<email id="998349883487454359203" Body="hi"/>
</temp>
我想阅读每个电子邮件标签的xml文件.也就是说,在我想要从中读取电子邮件id = 1..extract body时,读取的电子邮件id = 2 …并从中提取主体…等等
我尝试使用DOM模型进行XML解析,因为我的文件大小是100 GB ..这种方法不起作用.然后我尝试使用:
from xml.etree import ElementTree as ET
tree=ET.parse('myfile.xml')
root=ET.parse('myfile.xml').getroot()
for i in root.findall('email/'):
print i.get('Body')
现在,一旦我得到根…我不知道为什么我的代码无法解析.
使用iterparse时的代码抛出以下错误:
"UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 437: ordinal not in range(128)"
有人可以帮忙
解决方法:
iterparse的一个例子:
import cStringIO
from xml.etree.ElementTree import iterparse
fakefile = cStringIO.StringIO("""<temp>
<email id="1" Body="abc"/>
<email id="2" Body="fre"/>
<email id="998349883487454359203" Body="hi"/>
</temp>
""")
for _, elem in iterparse(fakefile):
if elem.tag == 'email':
print elem.attrib['id'], elem.attrib['Body']
elem.clear()
只需用您的真实文件替换fakefile即可.
另请阅读this了解更多详情.
今天的关于对大型XML文件使用Python Iterparse和xml文件大于等于怎么写的分享已经结束,谢谢您的关注,如果想了解更多关于elixir – 使用xmerl读取大型XML文件会导致节点崩溃、iphone NSXMLParser解析xml文件、perl – 使用XML :: TWIG进行大型xml文件解析失败、python – 在不使用DOM方法的情况下迭代解析大型XML文件的相关知识,请在本站进行查询。
本文标签: