Schrift
[thread]7423[/thread]

print DATEI-> Verständnis



<< |< 1 2 >| >> 18 Einträge, 2 Seiten
master
 2005-11-03 09:43
#59612 #59612
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen...

Code: (dl )
1
2
3
    open(RAUS, ">$_[0]") or die $!;
print RAUS $_[2];
close(RAUS);


Wann wird definitiv in die Datei geschrieben?
DIREKT bei dem Befehl PRINT?

oder wartet Perl erst und schreibt erst bei close();?
Muss es genau wissen...

ich denke das Print schon schreibt, bin mir aber nicht ganz sicher..

Also würde folgender Code die selbe Stelle 2 mal überschreiben oder?
Code: (dl )
1
2
3
4
5
6
7
8
    open(DATEI, ">$_[0]") or die $!;

print DATEI $_[2];
seek(DATEI, 1, 0);
print DATEI $_[2];


close(DATEI);
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
renee
 2005-11-03 10:13
#59613 #59613
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn Du autoflush auf 1 setzt, wird sofort geschrieben... ($|++)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Dubu
 2005-11-03 10:14
#59614 #59614
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ausgaben von print() werden grundsaetzlich erst mal gepuffert. Das kann mit der Variable $| ausgeschaltet werden (s. perlvar). Oder man nimmt gleich syswrite().

Da ich mal vermute, dass es immer noch um dein "sicheres Loeschen" geht, sei der Hinweis erlaubt, dass Dateisysteme mit Journalen (zu denen AFAIK auch NTFS gehoert) grundsaetzlich die Daten nicht direkt an ihre Zielposition schreiben, sondern eben erst im Journal speichern. Ein schnelles, mehrfaches Ueberschreiben wirkt deshalb immer nur auf eine Speicherstelle im Journal, nicht auf die Platte. Ob und wie man das Journaling umgehen kann, haengt von Betriebssystem und Dateisystem ab.
master
 2005-11-03 10:50
#59615 #59615
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
thnx....

Ok wie umgeht man dieses Journaling?

Oder gibt es eine andere methode um direkt auf diese Speicheradresse zuzugreiffen?

ps. das ist genau der Grund wieso ich so Zeugs (Standardbefehle die sich nicht umgehen lassen) nicht mag...
gibts keine "write_directly_to_right_filepos()"?


Wäre froh wenn du mir weiterhelfen könntest...

also so?
Code: (dl )
1
2
3
4
5
6
7
$| = 1;

open(DATEI, ">$_[0]") or die $!;
print DATEI $_[2];
seek(DATEI, 1, 0);
print DATEI $_[2];
close(DATEI);
\n\n

<!--EDIT|master|1131008036-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2005-11-03 11:24
#59616 #59616
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
benutze nun syswrite.. kann es sein das der Befehl
etwa 132 mal schneller ist????

Code: (dl )
1
2
3
4
5
6
7
8
9
10
#methode1
# open(RAUS, ">") or die $!;
# binmode(RAUS);
# for(1..($_[1])) {print RAUS $_[2];seek(RAUS, 0, 1);}
# close(RAUS);

#methode2
sysopen(DATEI, $_[0], O_WRONLY | O_CREAT) || die "$Datei: $!";
syswrite(DATEI,$_[2]);
close(DATEI);



Methode 1 -> brauchte 6,6 min.
Methode 2 -> Ist in 0.05 min Fertig!

Stimmt da was nicht?
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
esskar
 2005-11-03 11:30
#59617 #59617
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
emm; die erste variante ist eine schleife; die zweite nicht!
master
 2005-11-03 11:46
#59618 #59618
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
ups... peinlich..  :-)


ps. wegen dem journaling -> es wird doch trotzdem geschrieben, schnelles schreiben wäre möglich oder?

ich meine die DATEN werden ja, zwar zuerst ins journal.. jedoch dann gleich an die richtige stelle geschrieben oder?

----
Habe es jetzt geändert methode 2 auch in eine schlaufe....

Dabei aber folgendes Festgestellt
1. syswrite = 3 mal schneller
2. Bei methode 2 ändert sich während des vorgangs die Dateigrösse nicht...

Ich schreibe eine 100MB gross Datei mehrmals.
Bei methode 1 ändert sich die dateigrösse nach jedem durchlauf, und man kann sehen wie das skript das File "schreibt" also die datei immer grösser wird..

Bei Methode 2 ist dies nicht der Fall.. Die Datei wird 1 mal aufgebaut.. und danach ändert sich deren gröss nicht mehr..

Schreibt syswrite "wirklich" oder "tut es nur so" und schreibt erst am ende 1 mal alles?\n\n

<!--EDIT|master|1131011620-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
esskar
 2005-11-03 11:52
#59619 #59619
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=master,03.11.2005, 10:46]ich meine die DATEN werden ja, zwar zuerst ins journal.. jedoch dann gleich an die richtige stelle geschrieben oder?[/quote]
eigentlich ist das Journal (zumindest unter NTFS) nur eine Art History, in der drin steht, wann etwas mit welcher Datei gemacht wurde, oder nicht?
master
 2005-11-03 12:01
#59620 #59620
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Der Beitrag von Dubu hat mich verunsichert...
Dache auch das es eine art History ist.. habe in zwischenzeit mich darüber schlaugemacht.. da steht zwar schon, dass es erstmal ins journal geschrieben wird...

http://de.wikipedia.org/wiki/Journaling

Um zuverhindern, dass wenn das System abstürtzt zwischen den Schreibzugriffen, damit das FS nicht zur sau geht.. :-)



@Dubu zur Zeit schreibe ich so oder so zuerst die ganze Datei komplett also alle 100MB, dann ein close... und dann neu..
sollte eigentlich klappen oder? nur ein herumspringen mit offsets wäre nat. schöner..
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Dubu
 2005-11-03 12:08
#59621 #59621
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=master,03.11.2005, 11:01]@Dubu zur Zeit schreibe ich so oder so zuerst die ganze Datei komplett also alle 100MB, dann ein close... und dann neu..
sollte eigentlich klappen oder? nur ein herumspringen mit offsets wäre nat. schöner..[/quote]
Das sollte recht sicher sein, weil das Journal bestimmt deutlich kleiner ist. Ob da ein close() zwischendurch kommt, duerfte weniger wichtig sein als die Datenmenge bzw. die Menge an Sektoren, die nacheinander beschrieben werden, bevor der erste Sektor zum zweiten Mal beschrieben wird.

Genaues koennen fuer NTFS aber wahrscheinlich nur Microsoft und eine Handvoll weiterer Firmen sagen, da NTFS nicht offen gelegt ist.
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2005-11-03 09:43.