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

wie kann ich perl anweisen nicht den ram: zu benutzen sondern die swap-partition?



<< >> 10 Einträge, 1 Seite
supersucker
 2005-05-19 16:51
#55057 #55057
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
hi zusammen,

ich hab ein riesiges problem:

nächste woche soll eine von mir erstellte datenbank mit entsprechenden abfrage-scripten in betrieb gehen, das ganze läuft auf meinem entwicklungssystem auch ohne probleme, was ich nicht bedacht hatte:

die datenbank wird recht gross, ca. 17 GB, in meinen Abfrage-scripten lasse ich mir bei jeder query die komplette ergebnismenge zurückgeben um mit ihr verschiedene berechnung anzustellen, zu sortieren usw,
dummerweise ist die ergebnismenge einer query fast immer mehr als 1 GB groß, beim ausführen des scripts krieg ich die fehlermeldung:

Code: (dl )
DBD::Pg::st execute failed: out of memory for query result at ./PDBQuery.pl line 376, <FILE> line 13484.


weil der rechner auf dem das script läuft nur 1 GB RAM hat!

kann ich perl irgendwie anweisen die auslagerungsdatei zu benutzen und nur soviel RAM wie verfügbar ist?
in sprachen wie in R und matlab geht das, ist das in perl überhaupt möglich?

danke für jede hilfe, wenn perl das nicht kann sitz ich echt in der sch....
Taulmarill
 2005-05-19 16:57
#55058 #55058
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich wüsste nicht wie das gehen sollte. ist es dir nicht möglich einige berechnungen in's sql auszulagern? das würde das ganze auch gleich ein wenig beschleunigen.
es gibt auch datenbanken bei denen man kleine perlscripte direkt auf der datenbank ausführen kann, PostgreSQL kann das z.B.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
supersucker
 2005-05-19 17:07
#55059 #55059
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Quote
ist es dir nicht möglich einige berechnungen in's sql auszulagern?


nein, den gedanken hatt ich auch, aber egal wie rum ich es drehe, muss ich mir irgendwann die ganze ergebnismenge zurückliefern lassen..........

hab auch schon auf cpan geschaut, aber nichts dazu gefunden.....

oder muss ich linux irgendwie anweisen, dass wenn ein script den ram aufbraucht den ram zu benutzen? ist das eher eine betriebssystem frage?
oder gibt es doch ein cpan - modul und ich hab nur falsch gesucht?
Strat
 2005-05-19 17:17
#55060 #55060
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
hast du dir schon mal angeschaut, wieviel ram zum zeitpunkt der fehlermeldung von jedem prozess, der daran beteiligt ist, benoetigt wird? und hast du ein 32-bit-Betriebssystem?

bei 32-bit-Betriebssystemen gibt es ein Limit von 2GB RAM pro Prozess, und dank speicherfragmentierung koennen die auch schon frueher erreicht sein (im extremfall sogar schon bei 1,4GB). Ich vermute mal, dass du eher an dieses limit stoesst.

Fuer einen Loesungsvorschlag brauche ich naehere Angaben wie Betriebssystem, Perl-Version, ...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
GwenDragon
 2005-05-19 17:21
#55061 #55061
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Den Speicher verwaltet das Betriebssystem, der Kernel. Und auch die Auslagerung in die Swap-Partition.\n\n

<!--EDIT|GwenDragon|1116508970-->
Crian
 2005-05-19 17:26
#55062 #55062
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Ich kann auch Dateien verarbeiten, die viel größer sind. Die Frage ist, musst Du die kompletten Daten gleichzeitig im Speicher haben? Wenn ja wird es einen Punkt geben, ab dem das einfach nicht geht.

Was willst Du denn mit den Daten machen?
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
ptk
 2005-05-19 17:31
#55063 #55063
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Kannst du nicht einen Cursor oder so verwenden? Bei MySQL wuerde ich HANDLER statt SELECT nehmen.
supersucker
 2005-05-19 18:38
#55064 #55064
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
erstmal danke für die vielen antworten!

das problem hat sich erledigt, das ganze lag am admin:

der hatte mir zugesichert, das ich unbegrenzt swap-speicher zur verfügung habe, was ich ihm auch erstmal, naiv wie ich bin, geglaubt hab.

da ich also davon ausging, dass es NICHT daran liegen kann, dass ich auf dem system einfach zu wenig swap-speicher zur verfügung, dachte ich das es vielleicht ein perl-problem ist, also das perl aus irgendwelchen gründen die ich nicht kenne (bin garantiert nicht das, was man einen perl-experten nennt...), nur den ram nützt und nicht swap.

wäre ich etwas mißtrauischer gewesen, hätte ich vor dem posten meiner frage ein

Code: (dl )
>> ulimit -a


ausgeführt und gesehen das der admin verpeilt / vergessen hat die swap-partition zu vergrössern und ich nur 512 MB zur verfügung hatte.........:-)

nun ja, swap-partition vergrößert und jetzt läufts....
ptk
 2005-05-19 19:10
#55065 #55065
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
ulimit zeigt doch nicht die Groesse des Swapspeichers an. Aber dafuer sieht man dort die maximal erlaubte Groesse des virtuellen Speichers (der pro User und Prozess eingestellt werden kann).
Crian
 2005-05-20 11:44
#55066 #55066
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Schön, dass es jetzt geht. Aber es hätte auch mein Weltbild zum schwanken gebracht, wenn man sich in Perl um so etwas kümmern könnte oder müsste.
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
<< >> 10 Einträge, 1 Seite



View all threads created 2005-05-19 16:51.