Array sortieren

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

  • #16
    ... aber es wird so jetzt immerhin die komplette suchworter.txt Datei eingelesen, ...
    nein, die schleife geht die datei durch, aber sie hat sie nie komplett im speicher. deswegen ist es besser, als
    ... muss ich alles in ein array exploden?
    eingelesen wird zeilenweise zyklus für zuklus in $buffer. was wir gern hätten, wäre aber ein ring buffer der länge 10. deswegen schlage ich folgendes vor:
    Code:
    i = 0
    buffer = array
    
    solange(kein datei_ende){
       buffer[i%10] = fgets(...)
       i++
    }
    du solltest dir überlegen, wie man das implementiert.

    der trick ist nun, dass wir von "i" an rückwärts zählen und wenn wir bei 0 ankommen, von 9 bis i. so hast du die letzten 10 zeilen aus der datei in der umgekehrten reihenfolge.

    Kommentar


    • #17
      Nein, kein Plan wie das gehn soll:

      Das klapt schon mal nicht:
      PHP-Code:
       $handle fopen ("suchworter.txt""r");
       
      $i 0;

      while(!
      feof($handle)){
         
      $buffer[$i] = fgets($handle1024);
          echo 
      $buffer.'<br>';
         
      i++



      Original geschrieben von penizillin
      fgets holt immer nur eine, rtfm. der zweite parameter ist die maximale anzahl bytes, die gelesen werden.
      Und sag mir doch bitte mal was rtfm ist?

      Kommentar


      • #18
        Das klapt schon mal nicht:
        natürlich nicht: syntaktisch falsch, semantisch auch nicht korrekt: den modulo-operator habe ich bewusst eingesetzt. im manual findest du heraus, was es damit auf sich hat.

        das echo kannst du dir übrigens in dieser schleife sparen.

        Kommentar


        • #19
          hab mich auch mal versucht.
          die datei wird quasi "rückwärts" eingelesen.
          laufzeit bei einer 820 mb-datei: 0,06 sek

          PHP-Code:
          $i=0;
          $lines=10;
          $last_lines=array();

          $fp=fopen('test.txt','r');
          fseek($fp0SEEK_END);
          $pos=ftell($fp);

          while(
          $i<=$lines-1&&!fseek($fp,$pos--))
           if(
          fgetc($fp)=="\n"||$pos==0)
            
          $last_lines[$i++]=htmlentities(fgets($fp));
          fclose($fp);

          print_r($last_lines); 

          Kommentar


          • #20
            Also mir fehlen erst mal die Worte, vielen Dank 3DMax, es funktioniert.

            Aber verstanden habe ich es noch nicht ganz, die Funktion fseek() ist schon mal eine die ich auch gesucht hatte und nicht wusste das es Sie gibt.
            Das man die while Schleife so steuern muss wäre mir auch nie eingefallen.

            Also im ganzen ein totaller Proficode auf den ich nie drauf gekommen wäre, aber ist der den auch so gebaut das nicht unnötig die ganze Datei geladen wird, wie von penizillin drauf hingewiesen wurde?

            @penizillin, was der modulo-operator ist habe ich mir durchgelesen, er gibt den Rest einer Divison von zwei Zahlen zurück, aber wie ich den jetzt hätte einsetzen können ist mir noch immer ein Rätsel, man kann halt nicht alles verstehen ohne es 100 mal selbst versucht zu haben.

            Kommentar


            • #21
              genau wie im pseudo-code beschrieben (inkrementierter index modulo 10) - auf diese weise hätten wir uns "im kreis" durch das 10-elementige array bewegt und hätten stets zugriff auf die letzten 10 einträge. das wäre schon sinnvoll, wenn du es verstanden hättest. 3dmax hat natürlich eine sehr effiziente lösung präsentiert, versuche sie wenigstens gut zu verstehen, wenn du sie schon übernimmst.

              Kommentar


              • #22
                3dmax seine Lösung ist ohne modulo-operator und es würde mir sicher leichter fallen diese Lösung mit der Zeit zu verstehen, aber ich weis noch nicht ob die auch sparsam genug ist mit dem Zeilen einlesen, du hast mich ja immerhin drauf hingewiesen das man nicht komplett die ganze Datei einlesen muss.

                Kommentar


                • #23
                  3dmax seine Lösung ist ohne modulo-operator und es würde mir sicher leichter fallen diese Lösung mit der Zeit zu verstehen ...
                  am modulo-operator soll's nicht scheitern.
                  ... aber ich weis noch nicht ob die auch sparsam genug ist mit dem Zeilen einlesen, ...
                  auch 3dmax vermeidet es, die datei komplett in den speicher einzulesen, insofern ist die lösung effizient. ob die datei-zeiger-operationen mittels fseek ebenso schnell sind, ist eine andere frage und soll getestet werden (vielleicht will 3dmax selbst meine idee ausarbeiten und vergleichen?), aber ich unterstelle unbedeutende geschwindigkeitsunterschiede.

                  Kommentar


                  • #24
                    Wenn das so ist und die Lösung von 3dmax auch vermeidet die komplette Datei in den Speicher zu lesen, dann muss ich zugeben das ich die einfach nehmen muss die Lösung, da Sie ja bereits funktioniert.

                    Ich bin dir aber sehr dankbar für die Geduld und Hilfe die du mir gegeben hast und wünsche dir und 3dmax noch schöne Feiertage, wer weiss, vielleicht werde ich mich irgendwann wieder mit dem Thema modulo-operator beschäftigen!!

                    Kommentar


                    • #25
                      viel erfolg.

                      Kommentar


                      • #26
                        Danke!!

                        Kommentar


                        • #27
                          Original geschrieben von penizillin
                          (vielleicht will 3dmax selbst meine idee ausarbeiten und vergleichen?), aber ich unterstelle unbedeutende geschwindigkeitsunterschiede.
                          ich behaupte das gegenteil
                          //Edit: wenn die Datei hinreichend groß ist (mb) - ansonsten spielt es eh keine rolle
                          come in and find out.
                          PHP-Code:
                          $start_time=microtime(true);
                          $i=0;
                          $lines=10;
                          $last_lines=array();

                          $fp=fopen('test.txt','r');
                          fseek($fp0SEEK_END);
                          $pos=ftell($fp);

                          while(
                          $i<=$lines-1&&!fseek($fp,$pos--))
                           if(
                          fgetc($fp)=="\n"||$pos==0)
                                  
                          $last_lines[$i++]=htmlentities(fgets($fp));
                          fclose($fp);

                          echo 
                          'runtime: '.(microtime(true)-$start_time).'<br />';


                          print_r($last_lines);
                          echo 
                          '<br /><hr /><br />';

                          $start_time=microtime(true);

                          $handle fopen ("test.txt""r");
                          while (!
                          feof($handle)) {
                             
                          $buffer[$i%10]=fgets($handle);
                             
                          $i++;
                          }
                          fclose ($handle);

                          echo 
                          'runtime: '.(microtime(true)-$start_time).'<br />';
                          print_r($buffer); 
                          Zuletzt geändert von 3DMax; 25.12.2006, 22:35.

                          Kommentar


                          • #28
                            alles klar.. und die ergebnisse?

                            Kommentar


                            • #29
                              Original geschrieben von 3DMax
                              ich behaupte das gegenteil
                              //Edit: wenn die Datei hinreichend groß ist (mb) - ansonsten spielt es eh keine rolle
                              come in and find out.
                              PHP-Code:
                              $start_time=microtime(true);
                              $i=0;
                              $lines=10;
                              $last_lines=array();

                              $fp=fopen('test.txt','r');
                              fseek($fp0SEEK_END);
                              $pos=ftell($fp);

                              while(
                              $i<=$lines-1&&!fseek($fp,$pos--))
                               if(
                              fgetc($fp)=="\n"||$pos==0)
                                      
                              $last_lines[$i++]=htmlentities(fgets($fp));
                              fclose($fp);

                              echo 
                              'runtime: '.(microtime(true)-$start_time).'<br />';


                              print_r($last_lines);
                              echo 
                              '<br /><hr /><br />';

                              $start_time=microtime(true);

                              $handle fopen ("test.txt""r");
                              while (!
                              feof($handle)) {
                                 
                              $buffer[$i%10]=fgets($handle);
                                 
                              $i++;
                              }
                              fclose ($handle);

                              echo 
                              'runtime: '.(microtime(true)-$start_time).'<br />';
                              print_r($buffer); 

                              Ich hab es mal getestet und mir ist aufgefallen, dass das zweite Script, also die empfohlene Version von penizillin schneller ist, aber dafür irgendwie nicht genau, die Reihenfolge letzter Suchbegriff zu erst ist hier nicht gegeben. Die erste Variante von 3dmax ist zwar langsammer dafür werden aber genau nach Reihenfolge, letztes Wort zuerst, ausgegeben.

                              Wenn die Varinate zwei auch so genau wäre wie eins, müsste man sie vorziehen, weil sie ja etwas schneller ist.

                              Kommentar


                              • #30
                                beachte meinen hinweis (unter dem pseudo-code), wie (in welcher reihenfolge) die ergebnisse aus dem buffer auszulesen sind. da dies aber ein konstanter aufwand ist, unterscheidet sich dieser teil der aufgabe nicht von dem von 3dmax.

                                Kommentar

                                Lädt...
                                X