Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7626[/thread]

XML-Datei in kleine Stücke zerlegen und parsen: XML-Datei zerlegen + parsen

Leser: 2


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
newbie_needs_help
 2006-01-17 11:10
#61961 #61961
User since
2005-08-17
21 Artikel
BenutzerIn
[default_avatar]
Hi zusammen!

Ich habe ein kleines Problem. Es handelt sich dabei um eine 21GB große XML File. Die meisten Module wie XML::Simple, XML::Parser aber lesen die komplette Datei ein und bearbeiten sie dann. Mmmh leider habe ich keine 21GB Ram ;)

Meine Idee um das Problem zu lösen:

1.) Diese riesige Datei in kleinere Sub-Dateien zu zerlegen und Schritt für Schritt zu parsen. So umgehe ich das Speicherplatzproblem.
-Kann mir wer einen heißen Tipp geben wie ich Dateien in Perl zerlegen kann und nach und nach in dem Script abarbeiten kann?

2.) Ein Modul finden, welches das XML nicht komplett in den Speicher läd.
-kennt jemand ein solches Modul?

Oder gibt es noch bessere Lösungsansätze? Für jeden Beitrag bin ich dankbar!
renee
 2006-01-17 11:49
#61962 #61962
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Benutze CPAN:XML::Twig. Schau Dir mal die FAQ und die Homepage von denen an. Da kann man die XML-Datei "chunk by chunk" parsen. Wenn Du die Gelegenheit hast, koenntest Du Dir das Buch "XML und Perl" anschauen. Das ist ganz gut und bespricht genau das, aber fuer den Anfang sollte die Doku zu CPAN:XML::Twig ausreichen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
newbie_needs_help
 2006-01-17 12:59
#61963 #61963
User since
2005-08-17
21 Artikel
BenutzerIn
[default_avatar]
Hey Renee,

danke!! :)

XML::Twig ist genau das Richtige um nach Schritt 2 vor zugehen. Und die Webpage von XML::Twig bietet auch ein hilfreiches Tutorial an.

Ich werde wohl diese Modul nutzen. Aber interessehalber, wie könnte man das Problem nach Schritt 1 lösen. Ich habe was über 'seek' und 'tell' gefunden, aber wie genau man das in ein Script einbindet leider nicht. :(\n\n

<!--EDIT|newbie_needs_help|1137499906-->
nepos
 2006-01-17 14:01
#61964 #61964
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Links im Board machst du mit [ url ]http://irgendwas[/ /url ] ohne die Leerzeichen ;)
ptk
 2006-01-17 22:24
#61965 #61965
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
SAX-Parser arbeiten event-basiert, also Stück für Stück (XML::Sax, bei XML::LibXML ist auch ein SAX-Parser dabei, AFAIK).
newbie_needs_help
 2006-01-18 11:38
#61966 #61966
User since
2005-08-17
21 Artikel
BenutzerIn
[default_avatar]
Danke für den Tipp ptk. Ich habe mich aber jetzt schon in XML::Twig eingelesen und es scheint ein gutes Modul zu sein welches meinen Anforderungen genügt ;D

Leider ist denoch ein kleines Probelm aufgetaucht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
...
<Entrezgene_unique-keys>
<Dbtag>
<Dbtag_db>HGNC</Dbtag_db>
<Dbtag_tag>
<Object-id>
<Object-id_id>5</Object-id_id>
</Object-id>
</Dbtag_tag>
</Dbtag>
<Dbtag>
<Dbtag_db>LocusID</Dbtag_db>
<Dbtag_tag>
<Object-id>
<Object-id_id>1</Object-id_id>
</Object-id>
</Dbtag_tag>
</Dbtag>
<Dbtag>
<Dbtag_db>MIM</Dbtag_db>
<Dbtag_tag>
<Object-id>
<Object-id_id>138670</Object-id_id>
</Object-id>
</Dbtag_tag>
</Dbtag>
</Entrezgene_unique-keys>
...


Das ist ein kleiner Ausschnitt aus dem XML Code den ich parsen möchte. Leider ist der Tag <Dbtag>, <Dbtag_db>, <Object-id> und <Object-id_id> nicht unique. D.h. sie kommen auch in anderen Tags weiter oben und unten vor. Mich interessiert aber lediglich die Information, die von <Entrezgene_unique-keys> umklammert wird.
Wie kann ich diese Information herausfischen? Wäre nett wenn ihr mir noch mal helfen könntet.

Ich dachte das Problem wäre einfach mit second_child,... zu lösen, aber anscheinend kann das Modul dieses nicht handeln. Gibt es eine andere Funktion die ich aufrufen kann um Sub-Subelemente zu öffnen?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/perl -w

use warnings;
use strict;
use DBI;
use XML::Twig; #http://xmltwig.com/xmltwig/tutorial/yapc_twig_s4.html for good references!!!

header();

my $twig = new XML::Twig(
TwigHandlers => #Gene-track element will be called when each player element has been parsed

{

"Entrezgene_unique-keys" => \&dbxref

#"Dbtag_tag" => \&dbxref #funzt nicht, weil es mehere TagElemente diesen Typs gibt

#"Object-id_id" => \&dbxref #funzt nicht, weil es mehere TagElemente diesen Typs gibt

}
);

$twig->parsefile("Homo_sapiens.ags"); #built the twig

sub dbxref {
my ($twig, $dbxref) = @_;

#leider gehen diese Ansätze nicht, da ich nur das 'erste Kind' erfassen kann. Wie kann ich weitere Subelemente aufrufen?
my $id = first_child('Dbtag') #->second_child('Dbtag_db')->text;
my $db = first_child('Dbtag') #->second_child('Dbtag_tag')->third_child('Object-id')->fourth_child('Obejct-id_id')->text;

print "$id\t$db\n";
}
newbie_needs_help
 2006-01-18 13:23
#61967 #61967
User since
2005-08-17
21 Artikel
BenutzerIn
[default_avatar]
:D

Problem gelöst!!

Für alle die irgendwann Mal das gleich Problem haben ist das Schlüsselwort TwigRoots!

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
...
my $global_db;
my $twig = new XML::Twig(
TwigRoots => #twig will be created only for Entrezgene_unique-keys elements
{ "Entrezgene_unique-keys" => 1 },
TwigHandlers => #Gene-track element will be called when each player element has been parsed
{
"Dbtag_db" => \&dbxref, #here $twig->purge forbitten, because the data of the twig are needed for &generef
"Object-id_id" => \&dbid
}
);
...
sub dbxref {
my ($twig, $dbxref) = @_;

my $db = '??';
if ($dbxref->text) {
$db = $dbxref->text;
}

$global_db = $db;
$twig -> purge;
$dbxref -> delete;
}

sub dbid {
my ($twig, $dbid) = @_;

my $id = '??';
if ($dbid->text) {
$id = $dbid->text;
}

print "$global_db - $id\n";
$twig -> purge;
$dbid -> delete;
}


Achtet bitte gut darauf an welcher Stelle ihr $twig->purge setzt! In manchen Fällen kann er wichtige Daten löschen. Bei mir kann ich den Aufruf in Beide setzen.
Crian
 2006-01-19 11:16
#61968 #61968
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Auch wenn das Problem schon gelöst zu sein scheint:

Ich verarbeite auch große XML-Dateien der Form

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Kopfdaten
Kopfdaten
Kopfdaten
<Klammer>
<Sub>
...
</Sub>
<Sub>
...
</Sub>
<Sub>
...
</Sub>
<Sub>
...
</Sub>
...
</Klammer>


Ich les erst den Kopf ein, dann immer einen Subblock, baue aus Kopf, Klammer und dem Subblock ein kleines Dokument (als Inhalt einer Variablen) zusammen und verfüttere diesen dann an XML::Simple. Funktioniert wunderbar.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
newbie_needs_help
 2006-01-23 14:18
#61969 #61969
User since
2005-08-17
21 Artikel
BenutzerIn
[default_avatar]
Hey,

das ist auch eine gute Idee. Ich werde es bei meiner nächsten Datei einmal ausprobieren. Was aber ein großer Nachteil von XML::simple ist, ist dass für jeden Tag der Hash um eine Dimension erweitert wird. Das ist ziemlich tragisch :) bei mir. Denn diese Datei hat teilweise 10 Ebenen. Was die Laufzeit angehen würde, ist meine Momentane Lösung deiner überlegen. Aber mit meiner Methode muss man wahnsinnig aufpassen um nicht Daten einfach zu überlesen, weil man sie in TwigHandlers vergessen hat anzugeben!
renee
 2006-01-23 14:24
#61970 #61970
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja, man muss sich vorher ueberlegen, was man haben will. Aber bei XML::Simple musst Du auch wissen, auf welche Elemente du zugreifen willst...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-01-17 11:10.