Problem, große Dateien bearbeiten über 4gb, kein mysql

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

  • Problem, große Dateien bearbeiten über 4gb, kein mysql

    Hallo liebe Softwareentwickler
    ich habe ein Problem :/
    Das Problem ist, wie kann man mit nur 256mb server ram eine große Datei die weit über 4gb oder 8gb groß ist, bearbeiten?


    Also z.b eine bestimmte Zeile. Beispiel: Zeile 7.789 bearbeiten ....



    Mit file array ( array file ( string $filename [, int $flags = 0 [, resource $context ]] ) führt das ja zu einem Verarbeitungs Abbruch des Servers?


    Wie könnte man das realisieren?


    Mit einem Dateizeiger und fgets in der while schleife ließt man realtiv schnell eine bestimmte Zeile Habe mir mal dann den ram Verbrauch angeschaut mit memory_get_usage....
    ca. 0.6kb ram bei einer 4gb großen datei.

    Ich selber programmiere sehr gerne mit PHP und seit Jahren, bloss so einen Fall hatte ich noch nicht.


    Ich bedanke mich

  • #2
    Zitat von wampisgood Beitrag anzeigen
    Mit einem Dateizeiger und fgets in der while schleife ließt man realtiv schnell eine bestimmte Zeile
    Dann brauchst du ja nur noch fwrite(), um den veränderten Inhalt zu schreiben.

    Kommentar


    • #3
      ehrlich? ohh


      Kannst du mir ein Beispiel geben das wäre sehr nett


      Hier mein code um eine bestimmte Zeile auszulesen:


      public function get_content_by_line($file, $pos)
      {
      $line = "";
      $buffer_line = "";

      $handle = fopen($file, "r");
      if ($handle)
      {
      while (($line = fgets($handle)) !== false)
      {
      $i++;
      if( $pos === $i )
      {
      $buffer_line = $line;
      break;
      }
      }
      fclose($handle);
      }
      else {}

      return $buffer_line;
      }

      Kommentar


      • #4
        wahrscheinlich eine kombi mit fseek(...) und fwrite(...) oder?
        Also muss ich im offset bereich springen ...
        Aber eine Frage habe ich noch .... Kann man mit fseek auch eine bestimmte Zeile anspringen?


        Wer Rechtsschreibfehler oder Grammatikfehler findet darf Sie behalten

        Kommentar


        • #5
          Ich habe greade selber mit php und mit nem hexeditor festgestellt
          das fseek immer nur bis zur Escape Sequenz '\n' (0x0A) ließt. Weiß nicht ob unter Windows mit '\r\n' auch bei '\r' schon stoppt. Bin Linux Fan und habe mich von Windows vor Monaten verabschiedet . Aber ich prüfe es mal trotzdem gleich

          Kommentar


          • #6
            Ich habe es schon fast selber hingekriegt mit dateizeiger, fgets und fwrite ich muss noch ermitteln mit strlen wie groß jeweils die zeile in der datei ist, dann alle so löschen Ich habe es fast kapiert mit dem offset Bereich
            Trotzdem bedanke ich mich für die hilfe von euch. Super. Danke nochmals.
            Ich wünsche euch eine erholsame und Gute Nacht

            Kommentar


            • #7
              Leider habe ich wieder ein problem :/ was leider aktuell ich nicht schaffe es zu lösen.
              z.b habe ich eine Textdatei mit folgendem Inhalt:


              1. oder 2. ist nur eine zeile ab dem 'h' beginnt das Zeichen



              1.hallo1
              2.hallo2
              3.hallo3
              4.hallo4
              5.hallo5




              Zeile 3 mit 'hallo3' belegt ja 6 bytes. Jetzt habe ich das problem das ich mit fgets und fwrite und dem Dateizeiger ja die 3 Zeile überschreiben kann, aber wenn ich z.b mehr wie 6 bytes habe z.b 200 bytes, dann zerstöre ich ja die anderen Informations Strukturen :/


              Mir geht es darum sehr große Dateien sehr schnell zu schreiben ...
              bei 4gb oder 8gb oder sogar 12gb alles in einem Array reinzuladen bringt ja nichts. Ich stehe wieder auf dem Schlauch. klar ich könnte auch, wenn ich weniger als 6 bytes haben z.b das den string hat "ist", bloss dann würde ja das so stehen =>"istlo3" ... man könnte ja eine Art Abbruchs tag einfügen z.b so "ist<~>". Das könnte man noch lösen aber wie löse ich das wenn ich mehr Zeichen habe als in der Zeile an sich (offset) ? Sollte ich einen Denkfehler haben, bitte sagt mir das Danke. Nochmals Vielen lieben Dank das ihr so nett seit und hilft, ich schätze das selber sehr.


              Sorry wegen Grammatik und Rechtsschreibfehler... (ist nicht extra, ich habe leider eine schwäche)

              Kommentar


              • #8
                hallo h3ll danke nochmal, für deine hilfe von gestern ich glaube ich habe hier im thread etwas falsch geschrieben :/ ich bin immer bis nach unten gegangen (gescroolt) und dann hier auf Antworten gegangen. Aktuell habe ich wieder ein Problem :/ wo ich auf dem Schlauch stehe. Könntest du dir etwas Zeit nehmen, wenn es dir keine Umstände macht? Ich bitte dich wirklich (Aber nur, wenn du kannst, Zeit und Laune dafür hast). Danke, den letzten Eintrag von mir lesen ...

                Kommentar


                • #9
                  Ich weiß nicht, ob es vom OS Dateioperationen gibt, um Inhalte zu "verschieben". In der PHP-Doku habe ich dazu jedenfalls nichts gefunden. Es bleibt wohl nichts anderes übrig als die Datei bis zum Ende neu zu schreiben.

                  Kommentar


                  • #10
                    hallo danke für deine Antwort. Schade... Oder man löst das so, man sagt, man reseviert für jede Zeile z.b 100kb und mit dem Abbruchstag z.b so <~> könnte man immer das ganze so umgehen
                    Aktuell fällt mir was anderes nichts ein ...

                    Ich programmiere selber mit über 9 Programmiersprachen und das schon ziemlich lange, bloss so ein Problem hatte ich persönlich selber noch nicht.

                    Ok danke schonmal Danke danke

                    Kommentar


                    • #11
                      Komischerweise meint jemand hier aus diesem Thread, das es nicht möglich sei einfach in die Datei Position zu springen und zu überschreiben.

                      hier:

                      Ja aber das stimmt ja so auch wieder nicht, mit fgets und fwrite und Dateizeiger geht es ja


                      In einem englischen/amerikanischen Forum meinte ein Softwareentwickler man solle blockweise einlesen und schreiben, temporär, mit split_str oder wie die funktion heißt ...


                      Ich teste mal bisschen aber vielleicht hat hier jemand noch eine intelligente lösung.

                      Kommentar

                      Lädt...
                      X