Reduire le temps de compression avec la zlib

Petit nouveau ! | 6 Messages

01 déc. 2005, 20:21

Slt,

Avec un script php, je fais de la compression de fichier ayant des tailles variables, de quelques mo à plusieurs centaines. J'utilise la syntaxe suivante:
     * $data = implode("", file("$fic_a_compresser"));
    * $gzdata = gzencode($data, 9);
    *
    * if (!$fp = fopen("$fic_a_compresser.gz", "w")) {
    *     exit("Impossible de créer le fichier compresser $fic_a_compresser.gz\n");
    * } else {
    *     fwrite($fp, $gzdata);
    *     fclose($fp);
    * }
Mon probleme, c'est que la compression est longue, tres longue, voir interminable. J'ai essayé avec un fichier de 3mo, pas de probleme ca se fait rapidement. Mais avec un fichier de 160mo, 35 minutes apres la compression n'etait pas fini, et ceci meme avec le mode de compression le plus faible (valeur 1, faut pas demander en mode 9). J'ai un p4 2.2ghz et 512mo de ram, donc je pense pas que ce soit mon pc qui mouline. Y aurait il un moyen de reduire le temps de compression?

++

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

05 déc. 2005, 12:47

Il me semble que la zlib est prévue pour compresser des pages générées dynamiquement donc qui ont besoin d'être compressée APRES génération

Si tu as des fichiers de 3 à plusieurs centaines de Mo, pourquoi ne pas les compresser une bonne fois pour toutes et de ne pas les compresser à chaque fois ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 6 Messages

05 déc. 2005, 19:42

Ba le script doit compresser un seul fichier, mais comme j'ai précisé, il peut faire 3mo ou 150mo.

Alors je ne vois pas ce que tu veux dire par "pourquoi ne pas les compresser une bonne fois pour toutes". Je fais ma compression à la fin du script quand je n'ai pu besion du fichier. En fait j'utilise un script php qui permet de faire de la conversion de format de fichier, et une fois que j'ai mon fichier dans le nouveau format, je fais la compression du fichier d'entrée.

++

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

06 déc. 2005, 10:41

- Est ce que tu as beaucoup de formats différents
- Est-ce que tu modifie le contenu de ton fichier avec ton script php ?

Ce que je te proposais, c'était de compresser tes fichiers manuellement en local chez toi, de les uploader sur ton serveur et que ton script PHP se contente de choisir le fichier à télécharger.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 6 Messages

06 déc. 2005, 21:22

-- Est ce que tu as beaucoup de formats différents
Non, mon script prend en entrée un fichier toto.ft, comme ceci:

Code : Tout sélectionner

mon_script.php toto.ft
en sortie j'obtiens un fichier toto.fc. Donc le script convertit un fichier ft en fc grace à l'appel de binaires.

- Est-ce que tu modifie le contenu de ton fichier avec ton script php ?
non, mon fichier .ft est lu par des binaires pour créer le .fc. Le fichier ft reste le meme à la sortie du script

Ce que je te proposais, c'était de compresser tes fichiers manuellement en local chez toi, de les uploader sur ton serveur et que ton script PHP se contente de choisir le fichier à télécharger
je n'utilise pas de serveur. En fait, à la base cette opération de conversion de fichiers se faisait sur Unix et on utilisait des script shell. J'ai porté cette application sur Windows et j'ai donc choisi php pour remplacer les shell script. Enfin bref, il n'y a pas du tout de web et de serveur derrière mes scripts php, tout est local.

Voila, j'espere qu'avec ce surplus d'info tu pourras d'aider pour que la compresion de mon fichier ft d'entrée soit compressable en un temps raisonnable.

A+

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 déc. 2005, 11:05

le fichier .ft de départ est toujours le même où c'est dès qu'il change que tu exécute le script ?

Si ton script perl fonctionnait, pourquoi l'avoir abandonné ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 6 Messages

07 déc. 2005, 19:34

ah non c'est pas toujours le meme fichier ft, le script fait la conversion de format du fichier passé en paramètre.

Ce n'etait pas des scripts Perl mais des script sh et csh, donc j'etais obligé de les reécrire pour Windows.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

08 déc. 2005, 10:58

Donc j'en revient à mon idée de départ : pourquoi est ce que tu ne fait pas la compression 1 seule fois (avec un script php, si tu veux), même si elle est très longue

Ensuite, tu conserve ce fichier compressé
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 6 Messages

08 déc. 2005, 19:23

Hum soit je comprends pas ce que tu veux dire, soit on est pas sur la meme longueur d'onde.
Qu'est ce que tu veux dire par faire la compression une seule fois? Avec le code php que j'utilise (cf 1er post), c'est bien ce que je fais. Je compresse mon fichier juste avant de sortir du script, mais cette compression est très longue lorsque le fichier est gros et c'est ca mon soucis, est ce qu'il y a pas un réglage à faire du coté de php (par exemple php.ini) ou utiliser une autre fonction que gzencode() pour compresser?

Pour schématiser ca se passe comme ca:

// appel du script
-> toto.php file.ft

<?php
...
mon_fonction_qui_compresse_file_ft();
?>

// en sortie j'ai mon fichier file.ft compressé + un fichier fc obtenu avec la conversion