GVKun编程网logo

对大型XML文件使用Python Iterparse(xml文件大于等于怎么写)

9

在本文中,我们将详细介绍对大型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文件大于等于怎么写)

对大型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文件会导致节点崩溃

elixir – 使用xmerl读取大型XML文件会导致节点崩溃

我有以下代码读取维基百科转储文件(~50 GB)并根据请求提供页面:

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时,我看到以下内容:

enter image description here

上面的代码有问题吗? GC不够快吗?虽然我可以看到每个进程的内存但它并没有告诉我很多.我怎么能看到这个记忆实际上去了哪里?

附:以下是今天崩溃转储的链接:https://ufile.io/becba.
原子数为14490,MsgQ为2表示:pages,0表示所有其他进程.

解决方法

默认的最大原子数略高于 1 million atoms.鉴于英文维基百科 has over 5 million articles和 xmerl seems to create an atom for each namespace URI,我认为它可能是罪魁祸首.

此外,尝试Elixir下面的代码失败只是一个“堆栈粉碎错误”.

Enum.each(1..2000000,fn (x) ->
  x
  |> Integer.to_string
  |> String.to_atom
end)

但是如果我用环境变量ELIXIR_ERL_OPTIONS =“t 5000000”将原子限制提高到500万,那么问题就会消失.

iphone NSXMLParser解析xml文件

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 – 使用XML :: TWIG进行大型xml文件解析失败

我正在尝试使用 XML :: Twig解析一个大的xml文件(大约100,000条记录),但perl解析失败并出现错误:

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个如果循环如上.它是否导致内存问题?

任何人都可以建议我如何克服这些记忆问题?

解决方法

在谷歌搜索perl“内存无法写入”之后,我猜测问题来自于在内存中一次性加载文件,例如参见 http://www.perlmonks.org/?node_id=457265或(不太可能)混合使用不同编译器编译的模块(例如使用Activestate)使用Cygwin perl打包,见 http://cygwin.com/ml/cygwin/2006-12/msg00798.html).

对于XML :: Twig来处理大文件,您需要告诉它在哪个级别处理文件的各个部分(通常通过定义处理子树的处理程序,然后丢弃它),请参阅模块的文档.

python – 在不使用DOM方法的情况下迭代解析大型XML文件

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 Iterparsexml文件大于等于怎么写的分享已经结束,谢谢您的关注,如果想了解更多关于elixir – 使用xmerl读取大型XML文件会导致节点崩溃、iphone NSXMLParser解析xml文件、perl – 使用XML :: TWIG进行大型xml文件解析失败、python – 在不使用DOM方法的情况下迭代解析大型XML文件的相关知识,请在本站进行查询。

本文标签: