Ankündigung

Einklappen
Keine Ankündigung bisher.

eof setzen.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • eof setzen.

    ich vermisse (bzw kenne nicht) bei Dateibearbeitung eine Möglichkeit an einer bestimmter stelle EOF(end of file) zu setzen.

    szenario:
    ich möchte die letzte 100 byte bei einer 30mb datei abschneiden.

    dafür muss ich die ganze datei komplet von anfang an bis zur filesize()-100 in eine andere datei schreiben und einschliesslich diese datei umbenennen um die schon vorhandene überschreiben.
    so eine vorgehensweise ist unefizient.

    optimal wäre in diesem fall einfach EOF an Position filesize()-100 zu setzen aber so eine möglichkeit kenne ich leider nicht.

    ich freue mich auf jeder Vorschlag
    Slava
    http://bituniverse.com


  • #2
    Hallo Slava,

    ich kenne den Anwendungsfall nicht genau, aber für mich hört sich das eher wie ein "error by design" an mit einer 30MB großen Datei operieren zu müssen.

    Sollte das wirklich notwenig sein, kannst du dir mal die Codes für EOF ansehen und diese Binär-Werte manuall in die Datei schreiben. Andere Idee ist die Dateien mit fread() (=binary save) von 0 bis filesize - 100 einzulesen. Das sollte recht effizient funktionieren.

    Siehe auch http://de3.php.net/manual/en/function.fread.php.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design before you start to write code!
    2. Discuss and review it together with experts!
    3. Choose good tools (-> Adventure PHP Framework (APF))!
    4. Write clean and reusable software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      http://de.php.net/manual/de/function.ftruncate.php

      Kommentar


      • #4
        warum denn error by design?
        was spricht gegen 30mb dateien, wenn ich geziehlt ein wert an position X mit länge Y auslese?
        funktioniert eigentlich schneller als zugriff auf db bei überförderten DB-Server.
        Die andere idee mit fread benutze ich schon( habe ich eigentlich oben beschrieben) setze aber buffer mit stream_set_write_buffer ein wenig grösser.

        wenn es keine direkte möglichkeit gibt eof zu setzen, dann werde ich natürlich das weiter machen. nur finde ich eben diese methode nicht unbedingt als die beste.
        Slava
        http://bituniverse.com

        Kommentar


        • #5
          Zitat von DiBo33
          http://de.php.net/manual/de/function.ftruncate.php
          Mein Gott
          ich programmiere seit 5 Jahre php und habe einfach diese funktion nie gebraucht.
          Ja natürlich ist das die Lösung
          PHP-Code:
          $datei="a.txt";
          $abschnitt=5;//5 zeichen abschneiden
          $fp=fopen("a.txt","rb+");
          fseek($fp,$abschnitt*-1,SEEK_END);
          ftruncate($fp,$abschnitt);
          fclose($fp); 
          vielen Dank DiBo33


          edit:
          es ist besser mit modifer "a" datei zu öfnen, dann kann man fseek sparen
          PHP-Code:
          $datei="a.txt";
          $abschnitt=5;//5 zeichen abschneiden
          $truncpos=(int)filesize($datei)-$abschnitt;
          $fp=fopen("a.txt","a");
          ftruncate($fp,$truncpos);
          fclose($fp);
          echo 
          filesize("a.txt"); 
          Slava
          http://bituniverse.com

          Kommentar


          • #6
            Zitat von Slava
            warum denn error by design?
            Weil ich nicht ganz verstehe, warum du das machst. Sind das Cache-Dateien, oder Daten-Dateien, ...? In der Regel verwendet man eine DB und um diese nicht zu stressen Statement-Caching.
            Viele Grüße,
            Dr.E.

            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            1. Think about software design before you start to write code!
            2. Discuss and review it together with experts!
            3. Choose good tools (-> Adventure PHP Framework (APF))!
            4. Write clean and reusable software only!
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            Kommentar


            • #7
              ich verwende für Cache eine datei, die aus mehreren cache-abschnitten besteht.
              bei einem ordnder , der aus mehreren cache-dateien besteht( etwa 1000) ist die suche von einer datei manchmal langsammer als in einer datei.
              mein content wird durch die content-id gesteuert. ich generiere bei veränderung von content ein eine grosse datei wo die Inhalte von allen ausgaben eine nach dem anderem reingeschrieben werden.
              werend Screibvorgang wird in eine index-datei die position und die länge von dem aktuelem content reingeschrieben und zwar genau an der position=content_id*30;

              wenn der besucher ein seite mit content_id= 400 aufruft, dann öfne ich einfach meine indexdatei setze zeiger auf 400*30 und lese die position X und die länge von dem content Y.
              dann bleibt nur die andere datei mit content aufmachen und ab der position X die ich eben in index-datei ausgelesen habe Y zeichen auszugeben.
              Slava
              http://bituniverse.com

              Kommentar


              • #8
                Hallo Slava,

                also doch "error by design". Sowas würde ich nur machen, wenn mich jemand mit einer Knarre in der Hand zwingt. Cache doch besser nach ID, sprich eine Datei für jede ID. Somit musst du nicht in einer Datei scannen, sondern kannst recht unkompliziert einfach auf die Datei zugreifen.
                Viele Grüße,
                Dr.E.

                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                1. Think about software design before you start to write code!
                2. Discuss and review it together with experts!
                3. Choose good tools (-> Adventure PHP Framework (APF))!
                4. Write clean and reusable software only!
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                Kommentar


                • #9
                  warum einfach, wenn es auch schwierig geht?
                  ich sage doch, dass bei mehreren dateien (mehr als 1000)im einem ordner dauert fopen(dateiname$id) manchmal langsamer als bei einem ordner mit 2 dateien.
                  bei guter mysql-verbindung lohnt sich einfach chachen von mehreren dateien nicht mehr, da es einfach in vergleich zu mysql-abfrage viel zu lange dauert.
                  Meine Lösung ist als notlösung vogesehen, wenn mysql-verbindug nicht so gut ist und mehrere dateien bei cachen erzeugt werden müssen.
                  die genaue grenze ist von OS und anderen faktoren abhängig, also kann ich dir nicht direkt sagen, dass bei datei 1001 wird geschwindigkeit gewonnen das muss eben getestet werden.
                  Slava
                  http://bituniverse.com

                  Kommentar


                  • #10
                    Hallo Slava,

                    ich sage doch, dass bei mehreren dateien (mehr als 1000)im einem ordner dauert fopen(dateiname$id) manchmal langsamer als bei einem ordner mit 2 dateien.
                    Die Ursache ist in der Filesystem-Theorie zu suchen. Der Effekt fällt auf Einzel-Maschinen nicht so ins Gewicht wie auf eben Cluster-Filesystem, da dort mehrere Hosts konkurrierend um FLOCK's werben. Deshalb setzt man hier eine alternative Variante des Cachings ein. Das geht ungefähr so:

                    Man nehme einen Cache-Ordner und erstelle dort eine Unterordner-Struktur wie folgt:

                    Code:
                    /cache_root/
                                  00/
                                  01/
                                  [..]
                                  fe/
                                  ff/
                    Die Ordner-Namen sind die ersten zwei Zeichen eines md5-Hashes. Wenn du nun eine Datei cachen möchtest, z.B. anhand einer ID (z.B. 5), so generierst du dir den Cache-Dateinamen per

                    PHP-Code:
                    <?php
                    $ID
                    5;
                    $filename md5('Page_'.$ID);
                    $folder substr($filename,0,2);
                    $cachefile $folder.'/'.$filename;
                    ?>
                    Anschließend nimmst du die ersten beiden Zeichen als Ordnernamen und schreibst die Cache-Datei dort hin. Somit erreichst du eine Unterteilung in mehrere Ordner und bist auf dem Filesystem auch erheblich schneller, weil über weniger INODES gescannt werden muss (=kleinerer INODE-Baum).
                    Viele Grüße,
                    Dr.E.

                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    1. Think about software design before you start to write code!
                    2. Discuss and review it together with experts!
                    3. Choose good tools (-> Adventure PHP Framework (APF))!
                    4. Write clean and reusable software only!
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    Kommentar


                    • #11
                      ja, das wäre auch eine alternative.
                      Andere seits funktioniert es auf diese weise und kommt mit etwa 1400 seiten ziemlich schnell zur recht. die datei ist in moment zirka 11mb gross und zugriff dauert etwa 0.0004 sec.
                      dabei habe ich zur testzwecke mit 80mb dateien gespielt und der ergebnis unterscheidet sich kaum von 11mb dateien.

                      wenn der content sich schnell änderte, dann würde ich bestimmt eine andere methode nehmen, aber es handelt sich um die nachtichten die sich überhaupt nicht ändern, sondern werden in DB und parallel in die cache-datei angehangt.
                      Also dieser Einsatz lohnt sich für mich.
                      Slava
                      http://bituniverse.com

                      Kommentar


                      • #12
                        Hallo Slava,

                        [..]0.0004 sec[..]
                        Das sind umgerechnet 400µs. Und du bist dir sicher, dass die Einheit stimmt? So lange brauchen auf meinem Entwicklungs-Notebook schon 100 Schleifendurchläufe mit ein paar Multiplikationen... Der Zugriff auf Platte ist dabei im Gegensatz zu Speicher-Zugriffen noch um einiges teurer...
                        Viele Grüße,
                        Dr.E.

                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        1. Think about software design before you start to write code!
                        2. Discuss and review it together with experts!
                        3. Choose good tools (-> Adventure PHP Framework (APF))!
                        4. Write clean and reusable software only!
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                        Kommentar


                        • #13
                          teste mal in einem ordner mit einer datei die etwa 20-100mb gross ist.
                          Code:
                          nicht getestet
                          $s=(float)microtime(true);
                          $fp=fopen($dateiname,"r");
                          fseek($fp,(int)(filesize($dateiname)/2));
                          $string=fwrite($fp,8000);
                          echo "aus einer datei";
                          echo (float)microtime(true)-$s;
                          
                          //test mit mehreren dateien
                          fseek($fp,0);
                          $i=0;
                          while (!feof($fp)) {
                              file_put_contents("a_".$i, fread($fp, 12000));
                          $i++;
                              
                          }
                          
                          und jetzt teste mal wie lange du zum dateiöfnen brauchst.
                          etwa so
                          $s=(float)microtime(true);
                          file_get_contents("a_400");
                          echo (float)microtime(true)-$s;
                          Slava
                          http://bituniverse.com

                          Kommentar


                          • #14
                            Hallo Slava,

                            ok, ich sehe, es ist für dich offensichtlich die richtige Vorgehensweise und ich kann dich nicht von meiner alternativen Caching-Methode überzeugen.
                            Viele Grüße,
                            Dr.E.

                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            1. Think about software design before you start to write code!
                            2. Discuss and review it together with experts!
                            3. Choose good tools (-> Adventure PHP Framework (APF))!
                            4. Write clean and reusable software only!
                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                            Kommentar


                            • #15
                              nee, so stur bin ich gar nicht.
                              es gibt immer was zum überlegen, und ich will nicht unbedingt die schlechteste methode für cachen haben.
                              eigentlich kann ich deine Standart-caching-methoden nicht als alternative-Caching-Methoden betrachten
                              oder hast du mir noch nicht alle gheim-rezepte gezeigt?(fuchs )

                              Kurze info zur mehreren dateien im ordner
                              ausschnitt aus doku zum shmop
                              -----------------------------------------------
                              IO test on 1000 files
                              IO Result of Regular Directory : 0.079015016555786
                              IO Result of Shared Memory Directory : 0.047761917114258

                              IO test on 10000 files
                              IO Result of Regular Directory : 3.7090260982513
                              IO Result of Shared Memory Directory : 0.46256303787231

                              IO test on 40000 files
                              IO Result of Regular Directory : 117.35703110695 seconds
                              IO Result of Shared Memory Directory : 2.6221358776093 seconds
                              ------------------------------

                              also testen, testen und noch mal testen.
                              Slava
                              http://bituniverse.com

                              Kommentar

                              Lädt...
                              X