Schrift
[thread]6141[/thread]

in den Arbeitsspeicher schreiben: kein Plan wie man sowas anfängt



<< >> 9 Einträge, 1 Seite
Froschpopo
 2004-03-14 20:33
#80995 #80995
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Hi, sorry dass ich damit noch mal nerve...
Wie Ihr ja wisst, baue ich einen Chat ...
Bisher schreibe ich ich Chat-Nachrichten in eine Textdatei...
Aber das ist der reinste Performancekiller da jedesmal auf die Festplatte zugegriffen werden muss!
Hat jemand eine Idee? Bitte nicht wieder irgendwelche Verweise auf Ralfchat, GTchat oder Strat-Chat sondern sachliche Hinweise. Wenn ich nur Links suchen würde, würd ich bei google suchen und nicht in ein Forum schreiben. Vielen Dank im Vorraus
esskar
 2004-03-14 21:06
#80996 #80996
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmmm...
immer dann, wenn du daten in einer variable speicherst, dann "speicherst" du in den Arbeitsspeicher...
so einfach ist das
Relais
 2004-03-14 21:57
#80997 #80997
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Verwende ein Linux-System mit viel Arbeitsspeicher, denn das cacht von vornherein seine Festplattenpartitionen großzügig.

Nun schreibst Du in Dateien, wie Du das gewohnt bist. Tatsächlich schreibt Betriebssystem den Kram schnell in den Cache und liest auch wieder von dort. Wenn Zeit bleibt, weil Du gerade nicht schreibst oder liest, schreibt das Betriebssystem dann auch auf die Platte.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
kabel
 2004-03-14 23:04
#80998 #80998
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
wie wäre es mit einer ramdisk?
dann hast du quasi das zugriffsinterface eines dateisystems und
die geschwindigkeit des arbeitsspeichers (minus einem vernachlässigbarem overhead).

das bringt aber andere probleme mit sich ...
-- stefan
Relais
 2004-03-14 23:28
#80999 #80999
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=kabel,14.03.2004, 22:04]wie wäre es mit einer ramdisk?
[...]
das bringt aber andere probleme mit sich ...[/quote]
...etwa dem zuvor noch effektiverem Plattencache ein wenig Speicher geraubt...
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Strat
 2004-03-15 01:35
#81000 #81000
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wie waere es, wenn du das ganze mit POE machst? dann hast du den overkill der externen kommunikation nicht, sondern kannst intern kommunizieren...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Froschpopo
 2004-03-15 02:09
#81001 #81001
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
kannst Du mir das erklären?Was fürn overkill meinst Du?
Strat
 2004-03-15 13:03
#81002 #81002
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
s/overkill/overhead/

wenn du mehrere prozesse hast, musst du informationen zwischen den einzelnen prozessen hin und herschieben, was du ueber das dateisystem machst. es ist jedoch (von Perl aus gesehen) ewig langsam, eine Datei zu oeffnen, den inhalt zu lesen oder zu schreiben und wieder zu schliessen. Besser ist da eine Datenbank oder shared memory.

Wenn du nur einen prozess als server hast, der sich um alle clients kuemmert, kannst du die informationen ganz einfach ueber variablen uebergeben (z.B. objekte, arrays oder hashes), und da du da voellig intern bleibst, ist das um einiges schneller. ein problem dabei ist, dass es da recht schwierig ist, mehrere client-requests quasi-parallel abzuarbeiten; ich habe fuer den Chat auf meiner HP CPAN:HTTP::Daemon gewaehlt, weil mir das viel arbeit abnimmt. die loesung, die mir von der theorie her am besten gefallen wuerde waeren threads (HTTP::Daemon ist leider nicht thread-safe) mit shared variablen, aber als ich das probiert habe (letzten fruehling mit perl5.8.0), stiess ich auf arge memoryleaks. aber das soll sich mit 5.8.2/3 schon verbessert haben. Eine andere Moeglichkeit waere, sich in einem prozess/thread selbst um die parallelisierung zu kuemmern, indem man den clients immer nur kleine haeppchen rausschiebt, und so moeglichst parallel arbeiten kann. dafuer wuerde ich POE (link siehe oben) verwenden...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2004-03-15 17:02
#81003 #81003
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ist open(2) auf modernen Unices tatsaechlich so viel schlechter? Hier ist ein Beispiel-Benchmark fuer das Lesen aus einer Datei und aus einem Shared-Memory-Bereich mittels IPC::ShareLite:
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
use Benchmark qw(cmpthese);
use IPC::ShareLite;

{
my $share = new IPC::ShareLite( -key => 1971,
-create => 'yes',
-destroy => 'no' ) or die $!;
open(my $bla, $0) or die $!;
$share->store(join "", <$bla>);
}

cmpthese(-1,
{fs => sub {
open(my $bla, $0) or die $!;
local $/ = undef;
my $buf = <$bla>;
#warn $buf
},
ipc => sub {
my $share = new IPC::ShareLite( -key => 1971,
-create => 'no',
-destroy => 'no' ) or die $!;
$share->fetch;
}
},
);

Und das Ergebnis:
Code: (dl )
1
2
3
4
5
6
Benchmark: running fs, ipc for at least 1 CPU seconds...
fs: 1 wallclock secs ( 0.76 usr + 0.26 sys = 1.02 CPU) @ 44383.33/s (n=45271)
ipc: 2 wallclock secs ( 0.91 usr + 0.13 sys = 1.04 CPU) @ 11486.54/s (n=11946)
Rate ipc fs
ipc 11487/s -- -74%
fs 44383/s 286% --

Das Ergebnis aendert sich signifikant zugunsten von Shared-Memory, wenn das ShareLite-Objekt nur einmal erzeugt wird (aber vielleicht wuerde ein offen gehaltenes Filehandle und ein seek() an den Anfang wieder die open()-Variante nach vorne bringen). Natuerlich gibt es weitere Parameter wie die Groesse des auszutauschenden Buffers, Locking muss vielleicht noch eingefuehrt werden etc.
<< >> 9 Einträge, 1 Seite



View all threads created 2004-03-14 20:33.