Auslagerungdatei vergrößern

kana

kana

Aktives Mitglied
Thread Starter
Dabei seit
03.07.2005
Beiträge
358
Reaktionspunkte
0
Hallo

Ich habe mir ein "kleine" Perl-Script geschrieben das aus einem "kleinen" Tar-Archiv(3,5GB) die darin enthalten Datein ausliest.
Wenn aber der Virtuele Speicher von Perl 2GB überschreite kommt die Fehlermeldung: Out of Memory ... usw.
Ich habe auch versucht das Archi zu entpacken, geht aber leider nur sehr schwer.
Habe nämlich nach 1 1/2 Tage und 20GB HDD Verbrauch abgebrochen (war nicht einmal bei der Hälfte).
Das Archiv enthält lauter 1KB Dateien und das massenweise.
Falls es jemanden interessiert das Archiv ist von www.freecddb.org

Nun meine Frage:
Kann man den Swapspace von OSX vorübergehten auf mehrere GB setzen und dann auch wieder zurück?
Und wenn ja wie?

MfG Kana
 
Nein, die Speicherverwaltung ist Sahe des Systems.

Was mir nicht klar ist:
  1. Warum benötigst Du ein Perl Skript, um ein Archiv auszupacken?
  2. Warum packst Du das Archiv nicht schrittweise aus, wenn es in einem Rutsch nicht klappt?
 
Ich habe das iBook 1,5 Tage durchgehend entpacken lassen.
Um wie teilweise es ist ein großen Archiv.
mit Perl ist es möglich den Inhalt auszulesen ohne das man es entpackt.
 
kana schrieb:
Ich habe das iBook 1,5 Tage durchgehend entpacken lassen.
Um wie teilweise es ist ein großen Archiv.
mit Perl ist es möglich den Inhalt auszulesen ohne das man es entpackt.
Was meinst Du mit "Inhalt auslesen"?
Wenn Du willst, poste doch mal das Perl Skript, vielleicht sehe ich dann, was Du vorhast. Mit schrittweise meine ich, dass Du nicht alle Dateien auf einmal entpackst.

Leider hast Du auch nicht geschrieben, wie Du versucht hast, das Archiv zu entpacken, ob es komprimiert ist und ob Du alle Dateien aus dem Archiv benötigst oder nur einige.

Mal abgesehen davon, dass es nicht geht, bezweifle ich auch, dass eine Vergrößerung der Auslagerungsdateien Dein eigentliches Problem lösen würde.
 
Hier ist das Script.
Ist zwar noch nicht ganz fertig aber um grundlegenden geht es.

Code:
use File::Find;
use Archive::Tar;
use Thread;
use DBI;
use Unicode::String;

$datenbank = "dbi:mysql:database=mp3;host=localhost;port=3306";
$user = "root";
$passwd = "";


$time = time();

print "Pfad realtiv zum Script angeben(./): ";
$url = <stdin>;
chomp $url;

$dbh = DBI->connect($datenbank, $user, $passwd) or die $DBI::errstr;
find(\&getTar, "$url");
$dbh->disconnect();
print "Benötigte Zeit in Sek.: ".$time-time."\n";



# Funktion für File::Find zum herausfinfenob .tar oder nicht
#--------------------------------------------------------------------------------
sub getTar()
	{
	if($_ =~/.tar/)
		{
		print "Open $_\n";
		readTar($_);
		print "Close $_\n";
		}
	}
	
# Funktion zum laden und auslesen des Archives
#--------------------------------------------------------------------------------
sub readTar()
	{
	my $tar;
	my $content;
	my @scontent;
	$tar = Archive::Tar->new;
	$tar->read($_[0],1);
	my @tarfilelist = $tar->list_files();
	foreach (@tarfilelist)
		{
		$lange = $#tarfilelist;
		$n++;
		#print "###############################\n ";

		print  "$n/$lange File:".$_." reading\n";
		#print "###############################\n";
		$content = $tar->get_content($_);
		@scontent = split "\n", $content;
		#print $scontent[2];
		getTagTar(@scontent);
		}
	$tar->clear;
	}

sub getTagTar()

	{
	# Einstellungen
	#------------------------------------------------------------------------------------
	$visualisierung = 0;				# 0 = Aus, 1 = Ein	
	
	# Arrays bei jeden Durchlauf zurücksetzen
	#------------------------------------------------------------------------------------
	my @artist;
	my @title;
	my @srow;
	my @ssrow;
	my @zeile;
	my $coment;
	my $album;
	my $gerne;
	my $year;
	my $id;
	my $tr;
	my $ti;
	my $alb;
	my $art;
	
	# Zeilen einzeln auswerten
	#---------------------------------------------------------------------------------
	$track = 0;
	foreach $string (@_)
		{
		my $row = new Unicode::String($string); 
		$row = $row->utf8();
		chomp $row;
		$row =~ s/_/ /g;
		# Album und Artist bestimmen
		# $temp_artist = $artist wenn nur ein Artist vorhanden ist
		#-----------------------------------------------------------------------------
		if($row =~ /DTITLE/)
			{
			$row =~ s/DTITLE=//;
			($temp_artist, $album) = split " / ", $row;
			$temp_artist = delspace($temp_artist);
			$album = delspace($album);
			}
			
		# Jahr bestimmen
		#----------------------------------------------------------------------------
		elsif($row =~ /DYEAR/)
			{
			$row =~ s/DYEAR=//;
			$year = delspace($row);
			}
			
		# Gerne bestimmen
		#----------------------------------------------------------------------------
		elsif($row =~ /DGENRE/)
			{
			$row =~ s/DGENRE=//;
			$gerne = delspace($row);
			}
		
		# Titel bestimmen
		# Wenn $row "-" oder "/" --> Aufteilung in Artist und Titel sonst wird $temp_artist verwendet
		#----------------------------------------------------------------------------
		elsif($row =~ /TTITLE/)
			{
			$row =~ s/TTITLE//;
			@srow = split "=", $row;
			if($row =~ /-/ and !($row =~ /\//))
				{
				@ssrow = split "-", $srow[1];
				$ssrow[0] = delspace("$ssrow[0]");
				$ssrow[1] = delspace("$ssrow[1]");
				if($ssrow[0] =~ /\d/ and !($ssrow[0] =~ /\D/))
					{
					$artist[$track] =  delspace("$ssrow[1]");
					$title[$track] = $temp_artist;
					}
				else
					{
					$title[$track] = delspace($ssrow[1]);
					$artist[$track] =  delspace($ssrow[0]);
					$coment = $temp_artist;					
					}
				}
			elsif($row =~ /\// or ($row =~ /-/ and ($row =~ /\//)))
				{
				@ssrow = split "/", $srow[1];
				if($#ssrow > 2)
					{
					$title[$track] = delspace($ssrow[2]);
					$artist[$track] =  delspace("$ssrow[0]/$ssrow[1]");
					}
				else
					{
					$title[$track] = delspace($ssrow[2]);
					$artist[$track] =  delspace($ssrow[0]);
					}
				$coment = $temp_artist;
				}
			else
				{
				$title[$track] = delspace($srow[1]);
				$artist[$track] = $temp_artist;
				}
				
			@hssrow = split "-", $$title[$track];
			if($hssrow[0] =~ /\d/ and !($hssrow[0] =~ /\D/))
					{
					$title[$track] = $hssrow[1];
					}

			($tr, $ti) = split " ", $title[$track];
			$tr = delspace("$tr");
			if($tr =~ /\d/ and !($tr =~ /\D/) and $coment)
					{
					$title[$track] = $ti;
					$artist[$track] = $coment;
					$coment = "";
					}		
			$track++;
			}
		elsif($row =~/DISCID/)
			{
			$row =~ s/DISCID=//;
			$id = delspace($row);
			}
		
		# Tracknummern entfernen
		($art, $alb) = split "-", $artist[$track];
		$alb = delspace("$alb");
		if($alb == $alblum)
			{
			delspace("$art");
			$artist[$track] = $art;
			}
		
		($art, $alb) = split " ", $artist[$track];
		$art = delspace("$art");
		if($art =~ /\d/ and !($art =~ /\D/) or $art =~ /\.\:/)
			{
			$artist[$track] =  delspace("$alb");
			$title[$track] = $coment;
			}
			
		# Tracknummer erhöhen
		if($row =~ /TTITLE/)
			{
			$track++;
			}
		}
	
	# Ausgabe
	#------------------------------------------------------------------------------------
	if($visualisierung)
		{
		print "Kommentar:\t$coment\nAlbum\t\t$album($id)\nGerne\t\t$gerne\nJahr\t\t$year\n";
			
		$track = 0;
		foreach(@title)
			{
			print $track . "\t" . $artist[$track] . "\t" . $title[$track] . "\n";
			$track++;
			}
		}
		
	$track = 0;
	
	# In Datenbank schreiben
	#------------------------------------------------------------------------------------
	foreach(@title)
		{
		if($artist[$track] and $title[$track] and !($artist[$track] =~/\?.*\?.*\?/) and !($title[$track] =~/\?.*\?.*\?/) and !($track =~/\?.*\?.*\?/) and !($album =~/\?.*\?.*\?/) and !($gerne =~/\?.*\?.*\?/) and  !($year =~/\?.*\?.*\?/) and !($id =~/\?.*\?.*\?/) and !($coment =~/\?.*\?.*\?/) and ($artist[$track] =~/\w/) and ($title[$track] =~/\w/) and ($track =~/\w/) and ($album =~/\w/) and ($gerne =~/\w/) and  ($year =~/\w/) and ($id =~/\w/) and ($coment =~/\w/) and $title[$track] =~ /.$/ and $artist[$track] =~ /.$/ and $album =~ /.$/)
			{
			writeDB($artist[$track], $title[$track], $album, $track, $gerne, $year, $coment, $id);
			}
		$track++;
		}
	}

# Funktion für die Datenbank
#----------------------------------------------------------------------------------------------------------------
sub writeDB()
	{
	# Nötig wenn keine Keys definiert sind
	#my $statement = qq{SELECT artist, title, album, track, gerne, year, coment, id FROM perl_cddb WHERE artist = "$_[0]" AND title = "$_[1]" AND album = "$_[2]" AND track = "$_[3]" AND gerne = "$_[4]" AND year = "$_[5]" AND coment = "$_[6]" AND id = "$_[7]";};
	#my $sth = $dbh->prepare($statement);
	#my $rv = $sth->execute;
	#my @spalte = $sth->fetchrow_array();
	#$rv = $sth->finish;
	#if(!@spalte)
		{
		$statement = qq{INSERT INTO perl_cddb (artist, title, album, track, gerne, year, coment, id) VALUES ("$_[0]", "$_[1]", "$_[2]", "$_[3]", "$_[4]", "$_[5]", "$_[6]", "$_[7]");};
		$sth = $dbh->prepare($statement);
		$rv = $sth->execute;
		$rv = $sth->finish;
		}
	}
	
sub delspace()
	{
	$_[0] =~ s/^\s+//;	# Führende Leerzeichen,
	$_[0] =~ s/^\W+//;	# Fürfrende nicht Wortzeichen,
	$_[0] =~ s/\s+$//;  # Beendende Leerzeichen enzfernene
	return $_[0];
	}

Hier der Teil der das Tar-Archiv betrifft

Code:
sub readTar()
	{
	my $tar;
	my $content;
	my @scontent;
	$tar = Archive::Tar->new;
	$tar->read($_[0],1);
	my @tarfilelist = $tar->list_files();
	foreach (@tarfilelist)
		{
		$lange = $#tarfilelist;
		$n++;
		#print "###############################\n ";

		print  "$n/$lange File:".$_." reading\n";
		#print "###############################\n";
		$content = $tar->get_content($_);
		@scontent = split "\n", $content;
		#print $scontent[2];
		getTagTar(@scontent);
		}
	$tar->clear;
	}
 
Kurz zu Deinem Skript: es fehlen "use strict" und "use warnings"
Code:
print "Benötigte Zeit in Sek.: ".$time-time."\n";
wird nicht funktionieren, aber das nur am Rande.
Das Modul WebService::FreeDB dürfte Dich evtl. interessieren?

Im übrigen würde ich Dir empfehlen mal einige Dateien (max. 10-20 Stück) aus Deinem Archiv manuell zu entpacken und daraus ein kleines Archiv zu erstellen, mit dem Du Dein Skript dann ausprobieren und entwickeln kannst.
Damit bist Du das Speicherproblem erst einmal los.

Ich würde mir auch überlegen, ob ich wirklich eine Gigabyte große Datenbank lokal auf dem Rechner vorhalten will. Das musst Du aber für Dich selbst entscheiden.
 
Zuletzt bearbeitet:
maceis schrieb:
Im übrigen würde ich Dir empfehlen mal einige Dateien (max. 10-20 Stück) aus Deinem Archiv manuell zu entpacken und daraus ein kleines Archiv zu erstellen, mit dem Du Dein Skript dann ausprobieren und entwickeln kannst.
Damit bist Du das Speicherproblem erst einmal los.


Und wie soll ich das machen?
Das habe ich wie bereits gesagt nach 36h und 20GB entpacken abgebrochen.
Gerade das ist der Grund wieso ich das Script geschrieben habe.

Was das mit time betrifft: Es ist ja noch nicht fertig.
 
kana schrieb:
Und wie soll ich das machen?
Das habe ich wie bereits gesagt nach 36h und 20GB entpacken abgebrochen.
Gerade das ist der Grund wieso ich das Script geschrieben habe.
...
Das ist aber dann kein guter Grund ;).
Schnellschuss (soll die ersten 15 Dateien aus dem Archiv entpacken):
Code:
i=1 && for file in `tar -tf archive.tar`; do 
if [ $i -le 15 ]
then
tar xvf archive.tar $file
i=$(( $i+1 ))
fi
done
kana schrieb:
...
Was das mit time betrifft: Es ist ja noch nicht fertig.
Na gut ;). Versuchs mal mit "time()-$time" anstatt "$time-time".
Das Statement zwei Zeilen weiter oben ist vermutlich auch noch nicht fertig ;).

Jetzt mal Karten auf den Tisch.
Was ist die eigentliche Aufgabe, die Du lösen möchtest?
Du brauchst Doch nicht wirklich > 20GB an CD Informationen, oder?
 
Zuletzt bearbeitet:
Zurück
Oben Unten