Schrift
[thread]11191[/thread]

Arbeitsspeicherproblem in Perl lösen (Seite 2)

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
soezkan
 2008-01-27 12:15
#105231 #105231
User since
2008-01-24
17 Artikel
BenutzerIn
[default_avatar]
Mit der folgenden Funktion binde ich das Perl in mein PHP-Skript ein:
Code: (dl )
1
2
3
function sunmoonriseset($lon, $lat, $tz, $year, $month, $day, $lang) {
return @exec("perl c:/apache/xampp/cgi-bin/sunmoon.pl lon=".$lon." lat=".$lat." tz=".$tz." year=".$year." month=".$month." day=".$day);
}


Alles was das PHP macht, ist den Wert der da rauskommt in ein CSV zu schreiben.
Sonst passiert nicht viel. Ich benutze Windows XP als Betriebssystem und ich
lasse mir jede bearbeitete Zeile per print(...) ausgeben: liegts vielleicht auch daran?

Vielen Dank!

Soezkan

ps:

hier das perl, in das die Indian.pm eingebunden wird:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use strict;
use Date::Indian;
use POSIX qw(ceil floor);
use Math::Round;

my(%FORM, $pair, $value, $name); # Hash FORM wird initialisiert

foreach $pair (@ARGV) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}

@ARGV = ();

my $date = Date::Indian->new(
ymd => sprintf("%s-%s-%s",$FORM{'year'},$FORM{'month'},$FORM{'day'}), # ex: ymd => '2003-10-31'
tz => sprintf("%s",dec2timezone($FORM{'tz'})), # ex: tz => '-5:30'
locn => sprintf("%sE %sN",$FORM{'lat'},$FORM{'long'}) # ex: locn =>'82:30E 17:25N'
);

my (@y, $m, $d, $t ) = $date -> ymd();

my ($moonrise, $moonset, $flag) = $date -> moonriseset();
my ($sunrise, $sunset, $flag) = $date -> sunriseset();

$moonrise = dec2hour_minute($moonrise);
$moonset = dec2hour_minute($moonset);

$sunrise = dec2hour_minute($sunrise);
$sunset = dec2hour_minute($sunset);

printf "MA $moonrise, MU $moonset|SA $sunrise, SU $sunset";


sub dec2time {
my ($Dec,$Hour,$m,$Minute,$s,$Second);

$Hour = floor($_[0]);
$m = $_[0] - $Hour;
$Minute = floor($m*60);
$s = ($m*60) - $Minute;
$Second = floor($s*60);

if($Hour < 10) {
$Hour = sprintf("0%s",$Hour);
}
if($Minute < 10) {
$Minute = sprintf("0%s",$Minute);
}
if($Second < 10) {
$Second = sprintf("0%s",$Second);
}

return $Hour.":".$Minute.":".$Second;
}

sub dec2hour_minute {
my ($Dec,$Hour,$m,$Minute,$s,$Second);
$Hour = floor($_[0]);
$m = $_[0] - $Hour;
$Minute = round($m*60);

if($Hour < 10) {
$Hour = sprintf("0%s",$Hour);
}
if($Minute < 10) {
$Minute = sprintf("0%s",$Minute);
}

return $Hour.":".$Minute;
}

sub dec2timezone {
my ($Dec,$Hour,$m,$Minute,$s,$Second,$minus);

if($_[0] < 0) {
$Hour = floor(abs($_[0]));
$m = abs($_[0]) - $Hour;
$minus = -1;
}
else {
$Hour = floor($_[0]);
$m = $_[0] - $Hour;
$minus = 1;
}

$Minute = round($m*60);

if($Minute < 10) {
$Minute = sprintf("0%s",$Minute);
}

$Hour = $minus * $Hour;

return $Hour.":".$Minute;
}
ptk
 2008-01-27 19:15
#105242 #105242
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Vielleicht bleiben die alten Perl-Prozesse bestehen? Was sagt dein Prozessmanager?
soezkan
 2008-01-28 12:15
#105275 #105275
User since
2008-01-24
17 Artikel
BenutzerIn
[default_avatar]
Ja genau, es bleibt zwar kein Perl-Prozess bestehen (Windows XP) jedoch ein svhost-Prozess der immer nur nach Ausführen des Befehls erzeugt
wird. Kann man Windows-Prozesse über Perl steuern?

Herzlichen Dank
Soezkan
Struppi
 2008-01-28 13:16
#105278 #105278
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Das liegt mit Sicherheit nicht an dem Perlskript (das übrigens gruselig ist).
soezkan
 2008-01-28 19:09
#105291 #105291
User since
2008-01-24
17 Artikel
BenutzerIn
[default_avatar]
Gruseliges Perlscipt hahahaha lol !!! Ich glaube auch schon fast ;)

Ich gebe auch zu, dass ich wirklich kein Perl-Profi bin. Aber ich
muss auch sagen, das es mir ein Rätsel bleibt, wie ich das
Speicherproblem lösen kann und anscheinend hat da ja niemand
wirklich einen Tipp. Oder vielleicht doch?

Wieter Antworten sind herzlich willkommen,
Soezkan
MatthiasW
 2008-01-28 20:24
#105294 #105294
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
soezkan+2008-01-28 11:15:17--
Ja genau, es bleibt zwar kein Perl-Prozess bestehen (Windows XP) jedoch ein svhost-Prozess der immer nur nach Ausführen des Befehls erzeugt
wird. Kann man Windows-Prozesse über Perl steuern?

Herzlichen Dank
Soezkan

Sicher das es svhost-Prozesse sind?
Nicht svchost?
Hab das gerade mal gegooglet, svhost.exe scheint nen virus zu sein... vgl. bspw. http://www.frankn.com/html/svhost_exe.php

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
styx-cc
 2008-01-29 00:18
#105299 #105299
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Also ich habe deine Subs 100000 durchlaufen lassen und es hat 5MB Arbeitspeicher gekostet:
Code: (dl )
1
2
3
4
5
6
7
8
9
for (1..100000){
$moonrise = dec2hour_minute($moonrise);
$moonset = dec2hour_minute($moonset);

$sunrise = dec2hour_minute($sunrise);
$sunset = dec2hour_minute($sunset);

printf "MA $moonrise, MU $moonset|SA $sunrise, SU $sunset";
}


edit:
selbst
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for (1..100000){
my $date = Date::Indian->new(
ymd => sprintf("%s-%s-%s",$FORM{'year'},$FORM{'month'},$FORM{'day'}), # ex: ymd => '2003-10-31'
tz => sprintf("%s",dec2timezone($FORM{'tz'})), # ex: tz => '-5:30'
locn => sprintf("%sE %sN",$FORM{'lat'},$FORM{'long'}) # ex: locn =>'82:30E 17:25N'
);

my (@y, $m, $d, $t ) = $date -> ymd();

my ($moonrise, $moonset, $flag) = $date -> moonriseset();
my ($sunrise, $sunset, $flag) = $date -> sunriseset();

$moonrise = dec2hour_minute($moonrise);
$moonset = dec2hour_minute($moonset);

$sunrise = dec2hour_minute($sunrise);
$sunset = dec2hour_minute($sunset);

printf "MA $moonrise, MU $moonset|SA $sunrise, SU $sunset";
}
braucht nur rund 5mb, laeuft aber wesentlich laenger
Pörl.
Struppi
 2008-01-29 13:36
#105320 #105320
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
soezkan+2008-01-28 18:09:13--
Gruseliges Perlscipt hahahaha lol !!! Ich glaube auch schon fast ;)

Die dec2time Funktion, könnte z.b. auch so aussehen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
sub dec2time_{
        my $time = shift;
        my $hour = int($time);
        my $nachkomma = ($time - $hour) * 60;
        my $minute = int( $nachkomma);
        my $second = int(( $nachkomma - $minute) *60);
        return sprintf '%02s:%02s:%02s', $hour, $minute, $second;
}


soezkan+2008-01-28 18:09:13--
Aber ich
muss auch sagen, das es mir ein Rätsel bleibt, wie ich das
Speicherproblem lösen kann und anscheinend hat da ja niemand
wirklich einen Tipp. Oder vielleicht doch?
Nein, da das Problem das du beschreibst nur bei dir Auftritt, bzw. unter umständen deine Schlußfolgerungen falsch sind. Vielleicht ist etwas an dem PHP Skript nicht i.O. oder besteht es nur aus dieser einen Zeile?
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2008-01-26 15:13.