Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql PerlXML::智能内存不足!错误_Mysql_Xml_Perl - Fatal编程技术网

Mysql PerlXML::智能内存不足!错误

Mysql PerlXML::智能内存不足!错误,mysql,xml,perl,Mysql,Xml,Perl,我有一个小的Perl脚本,它下载一个XML文件,使用解析,并通过删除和重新创建一个表将内容复制到MySQL数据库中 该脚本过去在Centos 5上运行良好,但最近磁盘崩溃,新驱动器上安装了Centos 6 XML文件的大小为21.5MB 我知道它会在解析文件时陷入困境,因为数据库表从未被删除或创建 my $XML = XML::Smart->new($location.'CategoriesList.xml') or die("Unable to parse Categor

我有一个小的Perl脚本,它下载一个XML文件,使用解析,并通过删除和重新创建一个表将内容复制到MySQL数据库中

该脚本过去在Centos 5上运行良好,但最近磁盘崩溃,新驱动器上安装了Centos 6

XML文件的大小为21.5MB

我知道它会在解析文件时陷入困境,因为数据库表从未被删除或创建

  my $XML = XML::Smart->new($location.'CategoriesList.xml')
      or die("Unable to parse CategoriesList.xml: $!");;
  $XML = $XML->cut_root();
  $XML = $XML->cut_root();

  $dbh->do("DROP TABLE IF EXISTS ice_categories");
  $dbh->do("CREATE TABLE ice_categories (
      category_id int(11) not null,
      parent_cat_id int(11) not null,
      category_name varchar(100) not null default '',
      category_description varchar(100) not null default '',
      category_image varchar(100) not null default '',
      category_thumb varchar(100) not null default '',
      KEY (category_id), KEY (parent_cat_id))
      CHARACTER SET utf8 COLLATE utf8_unicode_ci;");

  my @Categories = @{$XML->{CategoriesList}{Category}};

  my $c_categories = 0;
  foreach my $category (@Categories) {
    my $cat_name = ucwords($category->{Name}('langid','eq','1')->{Value});
    #print $category->{ID} . " => " . $cat_name . "\n";
    my $cat_desc = $category->{Description}('langid','eq','1')->{Value};
    my $cat_parent = $category->{ParentCategory}{ID};
    $dbh->do("INSERT ice_categories XXXX ");
    $c_categories++;
  }

  print "$c_categories categories imported.\n";
}
我不是很擅长Perl,所以如果有任何帮助,我将不胜感激。我已经看过了,但我不知道如何在这里使用它

xml文件的示例

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE ICECAT-interface SYSTEM "http://data.icecat.biz/dtd/ICECAT-   
      interface_response.dtd">
   <ICECAT-interface>
   <Response Date="Sat Apr 26 14:46:53 2014" ID="13219513" Request_ID="1398516412" 
   Status="1">
        <CategoriesList>
        <Category ID="127" LowPic="http://images.icecat.biz/img/low_pic/127-563.jpg"   
        Score="9725" Searchable="0" ThumbPic="http://images.icecat.biz/thumbs/CAT127.jpg" 
         UNCATID="43171520" Visible="0">
         <Description ID="548838" Value="Device or stand where you can rest your mobile or 
        fixed telephone." langid="1"/>
        <Description ID="8310" Value="" langid="2"/>
        <Keywords ID="3274" Value="" langid="1"/>
        <Keywords ID="3275" Value="" langid="2"/>
        <Keywords ID="3276" Value="" langid="3"/>
        <Keywords ID="3277" Value="" langid="4"/>
        <Keywords ID="3278" Value="" langid="5"/>
        <Name ID="255" Value="telephone rests" langid="1"/>
        <Name ID="471173" Value="telefoon steunen" langid="2"/>
        <Name ID="343915" Value="autres téléphones" langid="3"/>

Twig的一个很好的特性是,它支持Twig_handers在处理XML时“处理”XML,并且它具有清除方法,因此您可以将其丢弃以减少内存占用

我对XML::Smart还不够熟悉,不能说100%确定,但看起来您只是在处理类别元素

这应该行得通,但对于部分XML示例,因此无效,我不能完全肯定

use strict;
use warnings;
use XML::Twig;

sub process_category {
    my ( $twig, $category ) = @_;
    my $cat_name = $category->get_xpath('./Name[@mode="source"]', 0)->text;

    my $cat_name = $category->get_xpath('./Name[@lang="1"]', 0)->text;
    my $cat_desc = $category->get_xpath('./Description[@lang="1"]', 0)->text;

    ### do something with cat_name and cat_desc

    my $cat_parent = $category -> first_child('ParentCategory') -> first_child_text('ID');
    $twig -> purge; #discard data thus far.
}

my $twig =
    XML::Twig->new( twig_handlers => { 'Category' => \&process_category } );
$twig->parsefile('your_xml.xml');

恐怕我不知道“家长类别”是从哪里来的,所以我还没有解释。我假设它只是XML中没有显示的一个元素,但是它比purge更复杂,可能没有它那么有用

你给我们的支持很少。您可以显示XML的内容或链接吗?我已经添加了XML文件的片段。这里投票支持使用恒定内存,例如:SAX解析器,而不是基于DOM的解析器。