read big dbm-file

read big dbm-file

am 18.10.2007 13:04:07 von tlehmann

Mahlzeit,

Ich habe ein sehr grosses DBM-File.
Jegliche versuche diese Datei zu lesen (auch nur partiell)
werden vom oom-Killer beendet.

Die Datei ist ca. 160 MB gross und es stehen nur
ca. 300 MB RAM (inkl. Swap) zur Verfuegung.
In beiden Versuchen scheint das Problem erst beim lesen
des Hash aufzutreten. (s.u.)
Evtl. ist das DBM-File komprimiert und benoetigt deshalb soviel RAM.


Gibt es noch eine Moeglichkeit die DB zu lesen und evtl. zu bearbeiten?



Torsten

------------------------------------------------------------ ---
#!//usr/bin/perl
BEGIN { @AnyDBM_File::ISA = qw(DB_File GDBM_File NDBM_File SDBM_File); }
use AnyDBM_File ;


my $db;
$db = $ARGV[0];

#&testdbmopen; ## (soll man eigentl. nicht mehr verwenden)
&testtie;

## sub
sub testdbmopen {
print "D: dbmopen\n";
dbmopen(%dbm, $db, 0444) || die "cannot open $db for read $!\n";
print "D: for keys\n";
## hang on keys
# 30084 foo 18 0 212m 207m 1804 R 46.9 54.0 0:06.04 readdbm
foreach $key (keys %dbm) { # step through all values
print "$key\t%dbm{$key}\n";
}
dbmclose(%dbm);
}

sub testtie {
print "D: tie\n";
tie %h, "AnyDBM_File",$db, O_RDONLY,0600
or die "Cannot open file $db: $!\n";
print "D: for keys\n";
## hang on keys
for my $key (keys(%h))
{
my $totscore = $h{"$key|totscore"};
my $count = $h{$key};
print "D: $count $totscore\n";
next unless defined($totscore);
}
}

Re: read big dbm-file

am 18.10.2007 14:18:54 von struebig

Torsten L. schrieb:
> sub testtie {
> print "D: tie\n";
> tie %h, "AnyDBM_File",$db, O_RDONLY,0600
> or die "Cannot open file $db: $!\n";
> print "D: for keys\n";
> ## hang on keys
> for my $key (keys(%h))

versuch mal hier:
while( my ($key, $val) = each %h)

Struppi.

Re: read big dbm-file

am 18.10.2007 15:52:03 von Frank Seitz

Torsten L. wrote:
>
> Ich habe ein sehr grosses DBM-File.
> Jegliche versuche diese Datei zu lesen (auch nur partiell)
> werden vom oom-Killer beendet.
^^^^^^^^^^
Was ist das? Hast du eine Fehlermeldung?

> Die Datei ist ca. 160 MB gross und es stehen nur
> ca. 300 MB RAM (inkl. Swap) zur Verfuegung.
> In beiden Versuchen scheint das Problem erst beim lesen
> des Hash aufzutreten. (s.u.)
> Evtl. ist das DBM-File komprimiert und benoetigt deshalb soviel RAM.

Es ist eigentlich nicht Sinn einer DBM-Datei, komprimiert
oder komplett im Speicher gehalten zu werden.

> Gibt es noch eine Moeglichkeit die DB zu lesen und evtl. zu bearbeiten?

Dein Programm ist mir zu krautig, um es genauer anzugucken.
Allgemeiner Tip: Setze

use strict;
use warnings;

an den Anfang und reduziere das Programm auf die
wenigen relevanten Zeilen.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: read big dbm-file

am 18.10.2007 16:21:58 von tlehmann

In article ,
"J. Strübig" writes:
>
> versuch mal hier:
> while( my ($key, $val) = each %h)

Danke. Funktioniert.

Torsten

Re: read big dbm-file

am 19.10.2007 10:14:34 von Ingo Menger

On 18 Okt., 15:52, Frank Seitz wrote:
> Torsten L. wrote:
>
> > Ich habe ein sehr grosses DBM-File.
> > Jegliche versuche diese Datei zu lesen (auch nur partiell)
> > werden vom oom-Killer beendet.
>
> ^^^^^^^^^^
> Was ist das? Hast du eine Fehlermeldung?
>
> > Die Datei ist ca. 160 MB gross und es stehen nur
> > ca. 300 MB RAM (inkl. Swap) zur Verfuegung.
> > In beiden Versuchen scheint das Problem erst beim lesen
> > des Hash aufzutreten. (s.u.)
> > Evtl. ist das DBM-File komprimiert und benoetigt deshalb soviel RAM.
>
> Es ist eigentlich nicht Sinn einer DBM-Datei, komprimiert
> oder komplett im Speicher gehalten zu werden.
>
> > Gibt es noch eine Moeglichkeit die DB zu lesen und evtl. zu bearbeiten?
>
> Dein Programm ist mir zu krautig, um es genauer anzugucken.
> Allgemeiner Tip: Setze
>
> use strict;
> use warnings;
>
> an den Anfang und reduziere das Programm auf die
> wenigen relevanten Zeilen.

... &und &laß &die & weg, &wo &sie &nicht &gebraucht &werden.