Sneap: Problem mit zipen und spliten einer Datei in 199 MB Stücke

Hallo Leute,
ich hab hab da das kleine Problem, ich würd gerne eine Datei kompremieren und in eine bestimmte größe splitten lassen.
Ich hab jetzt auch schon 2 Tage nach was passendem gesucht, nur das einzigste was ich gefunden habe ist eine class.easyzip.php die auch das macht was ich möchte nur das Problem dabei ist das diese nur 1MB große Zip Teile erstellt ich würd die Datei aber gerne in 199 MB stückeln lassen.

Meine Frage ist jetzt, ist es möglich größere Teile zu erzeugen als 1 MB und wenn ja wie?

Danke schon mal an euch fürs helfen.

Ps: Wenn es eine andere Möglichkeit gibt wäre dies auch super es muß nicht unbedingt zip sein aber zumindest etwas was viele Leute entpacken können.

Mfg

  1. Hallo,

    ich hab hab da das kleine Problem, ich würd gerne eine Datei kompremieren und in eine bestimmte größe splitten lassen.

    also das, was gängige zip-Implementierungen schon seit Jahren können.

    Ich hab jetzt auch schon 2 Tage nach was passendem gesucht, nur das einzigste was ich gefunden habe ist eine class.easyzip.php die auch das macht was ich möchte nur das Problem dabei ist das diese nur 1MB große Zip Teile erstellt ich würd die Datei aber gerne in 199 MB stückeln lassen.

    Wo ist das Problem? Die Stückelung auf 1MB wird ja irgendwo im PHP-Code realisiert. Was ist naheliegender, als an dieser Stelle einen Wert zu verändern? Oder noch besser, einen Wert variabel zu machen, so dass beliebig große Fragmente erzeugt werden können?

    Ps: Wenn es eine andere Möglichkeit gibt wäre dies auch super es muß nicht unbedingt zip sein aber zumindest etwas was viele Leute entpacken können.

    Da wäre zip schon die erste Wahl, da dürften die Chancen am größten sein, dass der Empfänger das Archiv wieder lesen kann.

    Ciao,
     Martin

    --
    Fettflecke werden wieder wie neu, wenn man sie regelmäßig mit etwas Butter einschmiert.
    1. Wo ist das Problem? Die Stückelung auf 1MB wird ja irgendwo im PHP-Code realisiert. Was ist naheliegender, als an dieser Stelle einen Wert zu verändern? Oder noch besser, einen Wert variabel zu machen, so dass beliebig große Fragmente erzeugt werden können?

      Richtig. Im Code steht die Größe für 1 MB nur wenn ich den Wert auf 199 MB (in Bytes) setze dann bricht das Script beim bearbeiten ab und gibt ne Fehlermeldung raus das es so große Teile nicht verarbeiten könne...

      1. Hi!

        Wo ist das Problem? Die Stückelung auf 1MB wird ja irgendwo im PHP-Code realisiert. Was ist naheliegender, als an dieser Stelle einen Wert zu verändern? Oder noch besser, einen Wert variabel zu machen, so dass beliebig große Fragmente erzeugt werden können?

        Richtig. Im Code steht die Größe für 1 MB nur wenn ich den Wert auf 199 MB (in Bytes) setze dann bricht das Script beim bearbeiten ab und gibt ne Fehlermeldung raus das es so große Teile nicht verarbeiten könne...

        Was wohl dadurch begründet ist, dass es ein Memory-Limit für ausgeführte PHP-Skripte gibt - Wowereit!

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
        1. Was wohl dadurch begründet ist, dass es ein Memory-Limit für ausgeführte PHP-Skripte gibt - Wowereit!

          Und gibt es eine Möglichkeit das Memory-Limit zu umgehen um die 700 MB Datei denoch irgend wie in ein zip zu verwandeln und zu splitten ohne sie runter und dann wieder raufladen zu müssen?

          1. Hallo,

            Was wohl dadurch begründet ist, dass es ein Memory-Limit für ausgeführte PHP-Skripte gibt - Wowereit!
            Und gibt es eine Möglichkeit das Memory-Limit zu umgehen um die 700 MB Datei denoch irgend wie in ein zip zu verwandeln und zu splitten ohne sie runter und dann wieder raufladen zu müssen?

            <radio station="eriwan">Im Prinzip ja.</radio>

            Nach dem, was du bisher beschrieben hast, scheint die PHP-Klasse, die du gefunden hast, das Archiv komplett im Arbeitsspeicher zu erstellen. Nun müsste man wohl den Code komplett umstricken, so dass die Daten direkt von und zu Datei verarbeitet werden. Das ist aber wahrscheinlich eine größere Geschichte, und es dürfte fast einfacher sein, sich nach anderen fertigen Lösungen umzusehen, die das besser machen.

            Oder würde es dir genügen, die Originaldatei ohne Kompression einfach in kleiner Stücke zu splitten? Das wäre natürlich trivial. In Pseudocode:

            Fragment-Zähler n := 0
             Öffne Quelldatei zum Lesen
             Öffne Fragment #n zum Schreiben
             Solange Dateiende nicht erreicht
                Lies einen Block von Quelldatei
                Schreibe Block in Zieldatei
                Wenn Zielfragmen>Fragmentgröße
                   Schließe Fragment #n
                   Erhöhe n
                   Öffne Fragment #n zum Schreiben
                ---
             ---
             Schließe Fragment #n
             Schließe Quelldatei
             Fertig!

            Auf dem Zielsystem, wo die große Datei im Ganzen verarbeitet werden soll, müssen die Fragmente dann nur wieder zusammenkopiert werden.

            So long,
             Martin

            --
            F: Wer ist der Herrscher über Wasser, Wind und Wellen?
            A: Der Friseur.
            1. Oder würde es dir genügen, die Originaldatei ohne Kompression einfach in kleiner Stücke zu splitten? Das wäre natürlich trivial. In Pseudocode:

              Ne das hätte ich dann jaschon machen können ^^
              Mir gehts es da drumm Dateien die ich auf meinem Server habe zum Downloaden die größer als 199 MB sind zu zipen und splitten.

              Ich hab da noch eine Idee:

              Wäre es nicht möglich im Script das Memory_Limit zu erhöhen?
              In etwas so:

                
              ini_set("memory_limit","200M");  
              
              
              1. Hi!

                Wäre es nicht möglich im Script das Memory_Limit zu erhöhen?
                In etwas so:

                ini_set("memory_limit","200M");

                  
                Hast Du es probiert?  
                Natürlich ist das möglich - da ich Dein System und die Rechte des Dir überlassenen Benutzers nicht kenne, kann ich das aber nicht zuverlässig beantworten.  
                  
                  
                off:PP  
                  
                  
                
                -- 
                "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)  
                
                
                1. Hast Du es probiert?
                  Natürlich ist das möglich - da ich Dein System und die Rechte des Dir überlassenen Benutzers nicht kenne, kann ich das aber nicht zuverlässig beantworten.

                  nein noch nciht bin leider nicht zu Hause gerade werd ich mal testen morgen oder übermorgen und mich dann noch mal melden?

                  Mal neben bei muss ich das memory_limit auf die größe der Orginal Datei ändern oder reichen 200M für weil ja nur ein 199 MB File erzeugt werden soll?
                  Bzw wie hoch kann man das limit schrauben gibts es da eine Begrenzung?

                  1. Hi!

                    Hast Du es probiert?
                    Natürlich ist das möglich - da ich Dein System und die Rechte des Dir überlassenen Benutzers nicht kenne, kann ich das aber nicht zuverlässig beantworten.

                    nein noch nciht bin leider nicht zu Hause gerade werd ich mal testen morgen oder übermorgen und mich dann noch mal melden?

                    War das eine Frage? Nur Spass: mach das!

                    Mal neben bei muss ich das memory_limit auf die größe der Orginal Datei ändern oder reichen 200M für weil ja nur ein 199 MB File erzeugt werden soll?
                    Bzw wie hoch kann man das limit schrauben gibts es da eine Begrenzung?

                    Ja: die Begrenzung ist durch den *verfügbaren* physikalischen (und evtl. virtuellen) Speicher gegeben.

                    off:PP

                    --
                    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
                    1. War das eine Frage? Nur Spass: mach das!

                      Hab ich und das ist das Ergebniss:
                      Fatal error: Maximum execution time of 30 seconds exceeded in
                      /var/www/class.easyzip.php  on line 149

                      Kann die Zeit auch irgendwie erhöhen? Ansonsten scheitert es glaube ich an der maximum Bearbeitungszeit.

                  2. Mal neben bei muss ich das memory_limit auf die größe der Orginal Datei ändern oder reichen 200M für weil ja nur ein 199 MB File erzeugt werden soll?

                    Ich habe eigentlich keine Ahnung, aber da das Script es geschafft hat eine 700MB-Datei in 700 MB-Dateien (:-D) zu splitten würde ich annehmen, dass du dich an der Größe des Resultats orientieren musst (+x weil das Script selber ja auch noch 'n bisschen Platz braucht im Speicher).

                    Mal was anderes: Hast du nicht die Möglichkeit das außerhalb von PHP zu lösen?
                    So als Q'n'D-Lösung: Zip-Programm anstoßen es möge die Datei zerkleinern. Zip-Programm beginnt zu arbeiten und erzeugt vorhersehbare Dateinamen. PHP bietet die vorhergesehenen Dateien direkt an. Nur in der Zeit in der der Zip-Job läuft wären diese Links halt tot (oder führen auf unvollständige Teile) aber deshalb ja Q'n'D :-D

                    --
                    sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
                    1. Ich habe eigentlich keine Ahnung, aber da das Script es geschafft hat eine 700MB-Datei in 700 MB-Dateien (:-D) zu splitten würde ich annehmen, dass du dich an der Größe des Resultats orientieren musst (+x weil das Script selber ja auch noch 'n bisschen Platz braucht im Speicher).

                      Da hast du was falsch verstanden die Datei die geziptr werden soll ist 700 MB groß und soll gezipt werden und in 199 MB gesplitet

                      Mal was anderes: Hast du nicht die Möglichkeit das außerhalb von PHP zu lösen?
                      So als Q'n'D-Lösung: Zip-Programm anstoßen es möge die Datei zerkleinern. Zip-Programm beginnt zu arbeiten und erzeugt vorhersehbare Dateinamen. PHP bietet die vorhergesehenen Dateien direkt an. Nur in der Zeit in der der Zip-Job läuft wären diese Links halt tot (oder führen auf unvollständige Teile) aber deshalb ja Q'n'D :-D

                      Wie genau geht das? Wenn es außerhalb von PHP zu lösen wäre dann wär das auch ne möglich keit nur ich hab nur einen einfachen Webspace... weiß nciht was man da alles rauskitzeln kann.
                      Wie genau funktioniert die Methode?

                      1. Ich habe eigentlich keine Ahnung, aber da das Script es geschafft hat eine 700MB-Datei in 700 MB-Dateien (:-D) zu splitten würde ich annehmen, dass du dich an der Größe des Resultats orientieren musst (+x weil das Script selber ja auch noch 'n bisschen Platz braucht im Speicher).

                        Da hast du was falsch verstanden die Datei die geziptr werden soll ist 700 MB groß und soll gezipt werden und in 199 MB gesplitet

                        ja, hab ich schon verstanden... eine 700MB-Datei wird in 700 1MB-Dateien gesplittet soll aber in 3 199MB-Dateien sowie eine mit dem Rest gesplittet werden.
                        Ich habe nur die 1 vor "MB" weggelassen denn "MB" ist doch das gleiche wie "1MB" (daher der Smiley).

                        Was ich sagen wollte: Bisher brauchte dein Script auch keine 700MB Speicher wenn es die Datei in 1MB-Teile spaltete warum sollte es wenn es die Datei in 199MB-Teile spaltet plötzlich die gesamten 700 als Speicher benötigen? Das war doch deine Frage.
                        Daher würde ich annehmen dass man dem Script 199+x zugestehen müsste. Aber das ist wie gesagt nur geraten.

                        Mal was anderes: Hast du nicht die Möglichkeit das außerhalb von PHP zu lösen?
                        So als Q'n'D-Lösung: Zip-Programm anstoßen es möge die Datei zerkleinern. Zip-Programm beginnt zu arbeiten und erzeugt vorhersehbare Dateinamen. PHP bietet die vorhergesehenen Dateien direkt an. Nur in der Zeit in der der Zip-Job läuft wären diese Links halt tot (oder führen auf unvollständige Teile) aber deshalb ja Q'n'D :-D

                        Wie genau geht das? Wenn es außerhalb von PHP zu lösen wäre dann wär das auch ne möglich keit nur ich hab nur einen einfachen Webspace... weiß nciht was man da alles rauskitzeln kann.
                        Wie genau funktioniert die Methode?

                        Auf nem "einfachen Webspace" wird das nicht klappen, es sei denn du findest einen externen Dienstleister.
                        Was ich mir bestenfalls vorstellen könnte ist dass du selbst der Dienstleister bist: Du könntest eine Seite einrichten auf der die ungesplitteten Dateien präsentiert werden. Diese Seite hältst du geschützt. Auf deinem Rechner richtest du einen Cron-Job ein, der regelmäßig diese Seite aufruft, dort eine Datei hinunter läd, diese auf deinem Rechner splittet und sie dann wieder hoch läd. Gleichzeitig mit dem Hochladen der Teildateien weist man PHP an die temporäre (700MB)-Datei zu löschen.

                        Sowas [b]könnte[/b] man sich zumindest vorstellen, aber meine Überlegung war tatsächlich dass du die Kontrolle über eine Maschine hast und nicht nur Webspace.

                        --
                        sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
                        1. Leider hab ich nicht solche Rechte auf dem Server somit hab ich wohl kaum noch Möglichkeiten das Problem zu lösen.