Schrift
[thread]3123[/thread]

Kann man mit Perl Daten im Speicher halten? (Seite 2)



<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten
Crian
 2004-07-21 19:27
#30854 #30854
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Warum soll es swappen, wenn nicht jeder Prozess die 50MB vorhält, sondern diese einmal eingelesen und dann im Speicher belassen werden? Das ist doch gerade einer der Vorteile von mod_perl.
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
Gast Gast
 2004-07-21 19:59
#30855 #30855
[quote=Crian,21.07.2004, 17:27]Warum soll es swappen, wenn nicht jeder Prozess die 50MB vorhält, sondern diese einmal eingelesen und dann im Speicher belassen werden? Das ist doch gerade einer der Vorteile von mod_perl.[/quote]
ich denke das 50 MB 'ein Berg' sind (jedenfalls neben dem was sonst noch so im Speicher gehalten werden muß) - und wenn dann das Script noch in den 50 MB Daten rumschaufelt (da wird wohl noch einiges an temporären Hashes oder Arrays hinzukommen) dann bist Du sehr schnell an den Grenzen (und musst swappen).\n\n

<!--EDIT|Dieter|1090425579-->
ptk
 2004-07-21 20:01
#30856 #30856
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wenn fork() verwendet wird (das ist bei mod_perl der Fall) und die Daten nicht geaendert werden, dann werden bei beliebig vielen Prozessen trotzdem nur einmalig 50MB verbraucht (Stichwort copy-on-write). Wenn die Daten auch geaendert werden sollen, wird es leider komplizierter. Loesungen waeren da die Verwendung von Shared Memory (die entsprechenden Perl-Module waeren IPC::Shareable oder IPC::ShareLite) oder mmap, evtl. auch der Einsatz einer Datenbank, sei es DB_File, DBM::Deep oder eine "echte" Datenbank.
pq
 2004-07-21 20:03
#30857 #30857
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bei mod_perl hast du aber mehrere prozesse; reden wir mal von 5 (was noch
wenig ist). d.h. im endeffekt laufen dann 5 mod_perl-children mit jeweils
50MB, macht 250MB. würd ich als provider nicht gern sehn =)
(Edit:: siehe dazu ptks antwort)

ehrlich, bei solchen datenmengen nimm eine datenbank. das geht mit SQLite
sehr einfach und auch noch performant. die installation von
CPAN:DBD::SQLite dürfte auch kein problem sein. ich
benutze das grad selbst und werde es wohl demnächst bei meinem provider
ausprobieren.
noch ein punkt zu mod_perl: bei mehreren prozessen hat jeder prozess die
datenstruktur im speicher. wenn du jetzt einen wert änderst, ist der wert in
allen anderen prozessen aber noch der alte. das geht also gar nicht, würde
es doch zu völlig unterschiedlichen daten führen.\n\n

<!--EDIT|pq|1090425912-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
ptk
 2004-07-21 20:14
#30858 #30858
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Als Ergaenzung zu meiner Antwort: die Daten muessen natuerlich so frueh wie moeglich geladen werden (z.B. per PerlRequire im httpd.conf), ansonsten kommt man nicht in den Genuss des geteilten Speichers.

Eine weitere Moeglichkeit waere der Einsatz eines zusaetzlichen Daemons, der die grosse Datenstruktur haelt und mit dem httpd kommuniziert.
Gast Gast
 2004-07-21 21:03
#30859 #30859
Es ist schon erstaunlich dass er meint (ausgerechnet) PHP könnte mit diesen Problemen fertig werden - dem ist nicht so.
esskar
 2004-07-22 06:18
#30860 #30860
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=D,21.07.2004, 19:03]Es ist schon erstaunlich dass er meint (ausgerechnet) PHP könnte mit diesen Problemen fertig werden - dem ist nicht so.[/quote]
das behauptet er nicht;
es scheint es ja nicht in php lösen zu können und will deshalb nach perl wechseln; wenn es in perl nicht geht, dan sieht er jedoch keinen grund perl an dieser stelle zu benutzen, weil es ihm ja keinen Nutzen - sonder wohl nur mehr Arbeit - verschafft\n\n

<!--EDIT|renee|1090558790-->
Gimbly
 2004-07-22 09:19
#30861 #30861
User since
2004-07-21
3 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für die vielen Antworten!

Ja, es ist schon so, dass ich gerade deshalb überlege zu Perl zu wechseln, weil ich in PHP eben keine 50 MB im Speicher halten kann um darauf lesend und schreibend zuzugreifen. Mit ner DB kann ich's natürlich auch in PHP machen.

Aber so einfach, wie ich mir dass erhofft habe, scheint dass mit Perl wohl doch nicht zu sein. Ich denke, wenn Ihr als erfahrene Perler da schon so große Probleme seht, hab ich als Perl-Anfänger da kaum ne Chance, das mit vertretbarem Zeitaufwand hinzukriegen.

Schade, denn mit MySQL ist mir das Ganze viel zu lahm. müsste vielleicht mal ne andere DB ausprobieren.

Nochmals Danke für Eure Antworten - ist ein super Forum hier!

MfG
Mark
Taulmarill
 2004-07-22 13:06
#30862 #30862
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
@Troll: 50MB waren evtl. viel als du mal jung warst ;) heutzutage kommt das auf die ausstattung des rechners an. 1GB ram ist schon für 200 Euro zu haben (und auch noch für weniger, wenn man gar keine ansprüche hat). da lassen sich ne ganze menge 50MB "berge" unterbringen.

Wenn man die 50MB in einer variable hält, die im startup.pl lebt und von aussen nur über das ansprechen des packages (welches man in der startup.pl definiert) geschreiben/gelesen wird, wobei nie die variable direkt, sondern höchstens über eine referenz oder besser noch über angepasste funktionen angesprochen wird, sollten sich die 50MB doch eigendlich nicht vermehren, oder?\n\n

<!--EDIT|renee|1090847686-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
ptk
 2004-07-22 14:16
#30863 #30863
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Jedenfalls sprengt dieses Skript den virtuellen Speicher auf meinem Rechner nicht (500MB RAM + 1GB Swap):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
$x = " " x 50_000_000; # belegt 100MB, siehe Diskussion irgendwo bei perlmonks oder perl5.porters
for (1..100) {
my $pid = fork;
if ($pid == 0) {
warn $$;
sleep 10;
exit;
}
}
sleep 10;
<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten



View all threads created 2004-07-21 15:33.