[SOLVED] Perl-Ass gesucht

  • Moin moin,


    ich habe ein Problem mit dem Lesen und Schreiben einer VDR-Videodatei. Ok, es ist nicht wirklich ein Problem, es geht vielmehr um die Geschwindigkeit. Die von mir gefundene Lösung ist recht langsam und sieht so aus.

    Code
    open(OUT, "$rec[$i]/001.vdr");
    open(IN, ">>$newrec/005.vdr");
    my $j = 0;
    while($j < $offset){
      print IN getc(OUT);
      $j++;
    }
    close(IN);
    close(OUT);


    Vielleich kennt jemand 'ne schnellere Lösung bestimmte Bereiche einer großen Datei einzulesen und an eine andere anzuhängen.


    Gruß


    Merten

    SilverStone SST-LC10B-E mit Kram drin damit läuft.
    yaVDR 0.4

    Einmal editiert, zuletzt von neves ()

  • getc/print ist der Grund fuer die lahme Performance. versuch es mal mit read/write. Das liesst/schreibt mehrere Bytes in einem Rutsch - musst halt am Ende ein bischen fummeln, d.h. mehr lesen als noetig und dann die richtige Anzahl Bytes schreiben.

    H: MSI 651p, Celeron 2.4GHz, 512MB, 300GB, DVD, DXR3, TT Budget, CinergyT2, gLCD 128x64, PSOne
    S: SuSE 9.1 Kernel 2.6.21.5 vdr-1.4.6.1 - jumpplay-0.9-1.4.0
    P: cdda-0.1.0 dvd-0.3.6_b03 dxr3-0.2.7 epgsearch-0.9.22 femon-1.1.2 graphlcd-0.1.5 graphtft-0.0.15 mp3/mplayer-0.10.0 osdteletext-0.5.1 radio-0.2.0 streamdev-server-0.3.3-pre3-geni text2skin-1.1-cvs_ext-0.10 vcd-0.7
    A: lirc-0.8.1 noad-0.6.0 nvram-wakeup-0.97 vdradmin-am-3.5.2 vdrsync-0.1.3PRE1 VDRsyncGUI-041222

  • Mit read schreib' ich die Daten ja erstmal in eine Variable. Ich hätte gedacht, dass das bei großen Dateien bis 2GB weniger performant ist.

    SilverStone SST-LC10B-E mit Kram drin damit läuft.
    yaVDR 0.4

  • Zitat

    Originally posted by neves
    Mit read schreib' ich die Daten ja erstmal in eine Variable. Ich hätte gedacht, dass das bei großen Dateien bis 2GB weniger performant ist.


    Ohne die Interna von Perl wirklich zu kennen, wuerde ich vermuten, das Dein Konstrukt ebenfalls mit temporaerer Speicher arbeitet - sowas wie eine Variable ohne Namen, ok es fallen vielleicht ein paar Verwaltungsaufgaben weg, aber alles in allem sind die beiden IOs pro Byte das Problem.

    H: MSI 651p, Celeron 2.4GHz, 512MB, 300GB, DVD, DXR3, TT Budget, CinergyT2, gLCD 128x64, PSOne
    S: SuSE 9.1 Kernel 2.6.21.5 vdr-1.4.6.1 - jumpplay-0.9-1.4.0
    P: cdda-0.1.0 dvd-0.3.6_b03 dxr3-0.2.7 epgsearch-0.9.22 femon-1.1.2 graphlcd-0.1.5 graphtft-0.0.15 mp3/mplayer-0.10.0 osdteletext-0.5.1 radio-0.2.0 streamdev-server-0.3.3-pre3-geni text2skin-1.1-cvs_ext-0.10 vcd-0.7
    A: lirc-0.8.1 noad-0.6.0 nvram-wakeup-0.97 vdradmin-am-3.5.2 vdrsync-0.1.3PRE1 VDRsyncGUI-041222

  • Du solltest keinesfalls weniger als 8 KB auf einmal lesen und schreiben, besser mehr. Wenn du unter der Puffergröße des Dateisystems bleibst, hast du nunmal ganz erhebliche Performance-Verluste. Zum Vergleich: Bei zeichenweise Schreiben von Dateien erreichen diverse RAID-Controller grad mal 17 MByte/s, während sie bei mehreren MB in einem Rutsch über 100 MByte/s schaffen.


    Viele Grüße, Mirko

  • So, Umsetzung erfolgreich beendet. Das Frameweise lesen bzw. schreiben klappt dann auch in einer annehmbaren Geschwindigkeit. Nochmals, Danke.

    SilverStone SST-LC10B-E mit Kram drin damit läuft.
    yaVDR 0.4

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!