Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme taille de fichier

4 réponses
Avatar
Matthieu Gregoire
Bonjour,
Le travail que je dois effectué consiste à transformer des fichiers textes
(changer et rajouetr des caractères spéciaux). Pour cela je crée des
fichiers texte que je rempli à chaque exécution avec mon texte manipulé.
J'ai donc en netrée un fichier texte que je dois saisir et sur lequel je
dois travaillé et en sortie un aytre fichier texte que j'importai plus tard
dans une base de donnée. Le décors est planté!
Maintenant voici ou ca coince : Le programme s'exécute sans aucun problème
avec des fichiers qui peuvent aller jusqu'à 1 Mo. Par contre dès que la
taille de mon fichier d'entrée dépasse cette limite, soit le temps
d'exécution est beaucoup trop long (une dixaine de minutes!) soit un message
d'erreur s'affiche et aucun fichiers n'est crée. Le message d'erreur est le
suivant : impossible de télécharger la ressource à partir du fichier...

Voici mon script :
<?
echo date("H:i:s")."<br>";
function fragmenter($a,$b)
{
$fp=fopen("c:\\www\\essai1\\$a.txt","r");

while(!feof($fp))
{
$buffer=fread($fp,filesize("$a.txt"));
$line1=split("\*",$buffer);
$nb_mots+=(count($line1)-1);
$entier.=trim($buffer);
if($nb_mots>0)
$texte.=$buffer;
}
fclose($fp);


for($i=0;$i<4;$i++)
$code.=$entier[$i];
$toto="Þ".$code."Þ";

$string=ereg_replace("\*\*\-\-\*\*",$toto,$texte);
$longstr=strlen("$string");

for($i=0;$i<$longstr;$i++)
{
if($string[$i]=="Þ")
{
$j=$i;
while(ord($string[$j])!=10)
{
$str[$j]=ereg_replace("\*","Þ",$string[$j]);
j++;
$i=$j;
}
$str[$i]="Þ";
}
$str[$i+1]=$string[$i+1];

}
for($i=1;$i<$longstr;$i++)
$bdd.=$str[$i];
$bdd=trim($bdd);

$pt=fopen("c:\\www\\essai1\\$b\\$a.txt","w");
fwrite($pt,$bdd);
fclose($pt);
}


fragmenter(Edit1,anesthesie);
echo date("H:i:s");
?>
J'espère que vous pourrez m'aider, Cordialement

4 réponses

Avatar
P'tit Marcel
Matthieu Gregoire écrivit:

Le programme s'exécute sans
aucun problème avec des fichiers qui peuvent aller jusqu'à 1 Mo. Par
contre dès que la taille de mon fichier d'entrée dépasse cette limite,
soit le temps d'exécution est beaucoup trop long (une dixaine de
minutes!) soit un message d'erreur s'affiche et aucun fichiers n'est
crée. Le message d'erreur est le suivant : impossible de télécharger
la ressource à partir du fichier...

while(!feof($fp))
{


le while est incohérent avec l'instruction fread qui suit car celle-ci va
lire d'un coup la totalité du fichier.

$buffer=fread($fp,filesize("$a.txt"));


tu charges plus d'1Mo en mémoire... on voit que la ram ne coûte pas cher de
nos jours ;-)

$line1=split("*",$buffer);


idem $line1 devient un tableau d'1Mo.
nb1: * est un masque perl qui correspond au caractère '*'
nb2: pour une action si simple, mieux vaut éviter une expression régulière,
emploie plutot : explode('*',$buffer);


Sur le fond : pour éviter des pb de capacité, lis le fichier en entrée
ligne à ligne et traite indépendament chaque ligne. Traiter en mémoire la
totalité d'un gros fichier ça ressemble plus à de la bidouille sous Excel
qu'à de la programmation. Avec une lecture ligne à ligne, la durée de
traitement sera linéaire avec la taille du fichier.


eça
--
P'tit Marcel
statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/

Avatar
Matthieu Gregoire
P'tit Marcel a écrit dans le
message :


Sur le fond : pour éviter des pb de capacité, lis le fichier en entrée
ligne à ligne et traite indépendament chaque ligne. Traiter en mémoire la
totalité d'un gros fichier ça ressemble plus à de la bidouille sous Excel
qu'à de la programmation. Avec une lecture ligne à ligne, la durée de
traitement sera linéaire avec la taille du fichier.


eça
--
P'tit Marcel
statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/


Je suis obligé de lire mon fichier caractère par caractères. Comment puis je
faire toutes les transformations de mon fichier d'entrée sans me servir de
variables. J'avoue être complètement coincé. Peut être pourriez vous
m'apporter une idée fraîche car j'ai l'impression de tourner en rond!

Avatar
Matthieu Gregoire
P'tit Marcel a écrit dans le
message :
Matthieu Gregoire écrivit:

Je suis obligé de lire mon fichier caractère par caractères.


Ben non, ton script lit la totalité du fichier d'un coup. Il ne le lit pas
caractère par caractère (et heureusement d'ailleurs, avec 1M de lectures à
faire...)

Comment
puis je faire toutes les transformations de mon fichier d'entrée sans
me servir de variables.


Explique un peu quelles transformations tu veux faire : extrait du fichier
en entrée, résultat attendu. Est-ce qu'une transformation peut s'opérer
sur

plusieurs lignes d'un coup ? Pour l'instant c'est très flou...



C'est vrai que je m'explique un peu mal, je vais essayer d'être complé.
Je dois traité des fichiers textes contenant des comptes-rendus médicaux.
Mon but est d'importer ces fichiers dans une base de donnée, pour cela il me
faut donc les calibrer. Les fichiers déjà existants ont une architecture
particulière: Tous les fichiers commencent par le code du service et par le
type de compte-rendu . Ensuite chaque compte-rendu( propre à un seul
patient) commence avec la même ligne : **--**code service* type
compte-rendu*nom*prenom*sexe*nom marital*date de naissance. puis suit le
texte. Mon travail consiste à extraire toutes les lignes commencant par
**--** et à remplacer chaque * par un autre caractère spécial ( en
l'occurence j'ai choisit Þ) dans le but d'obtenir 8 champs distincts dans ma
base de données. Le reste du texte ne doit en aucun cas être modifié.
J'ai toujours le mêmeproblème quand je lance le programme avec des gros
fichiers( 14 Mo), c'est sur que si il me met en mémoire 14 Mo à chaque fois
que je me sers d'une variable, il a de quoi pédaler!!!
Voilà j'espère avoir été plus clair.
Merci de t'interessé à mon problème.
Matthieu gregoire


Avatar
P'tit Marcel
Matthieu Gregoire écrivit:

Tous les fichiers
commencent par le code du service et par le type de compte-rendu .
Ensuite chaque compte-rendu( propre à un seul patient) commence avec
la même ligne :
**--**code service* type compte-rendu*nom*prenom*sexe*nom marital*date de
naissance.
puis suit le texte.
Mon travail consiste à extraire toutes les lignes commencant
par **--** et à remplacer chaque * par un autre caractère spécial ( en
l'occurence j'ai choisit Þ) dans le but d'obtenir 8 champs distincts
dans ma base de données. Le reste du texte ne doit en aucun cas être
modifié.


Si je comprends bien, il s'agit juste d'extraire six champs (dont un texte
long) du fichier pour mettre à jour la table.

ça devrait aller avec un truc comme ça (non testé) :

$fp=fopen('c:wwwessai1'.$a.'.txt','r')
or die("impossible d'ouvrir $a.txt");

$entete=array();
$texte='';
while(!feof($fp)) {
$record=fgets($fp,4096);
if(substr($record,0,6)=='**--**') { # nouveau C/R
maj_table($entete,$texte); # stockage C/R précédent
$entete=explode('*',substr($record,6),7); # entête C/R
$texte='';
}
else $texte.=$record; # cumul du texte C/R
}
maj_table($entete,$texte); # stockage dernier C/R
fclose($fp);

function maj_table($entete,$texte) {
if(sizeof($entete)<>7) return; # entête incomplète ou rien à faire
$ligne=implode("Þ",$entete)."Þ".$texte;
$sql="insert into latable values('".
str_replace("Þ" , "','" , addslashes($ligne)). "')";
mysql_query($sql) or die(mysql_error()."<br>$sql");
}


le script lit les données ligne à ligne donc pas de pb de dépassement de
capacité mémoire.


eça
--
P'tit Marcel
statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/