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...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/
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/
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/
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!
P'tit Marcel <geononauxspams@centrale-lyon.org.invalid> a écrit dans le
message : Xns93AB9827CE797bulgroz7@213.228.0.133...
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!
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!
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
P'tit Marcel <geononauxspams@centrale-lyon.org.invalid> a écrit dans le
message : Xns93ACBEB40CF05bulgroz7@213.228.0.33...
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 <m.gregoire@estia.fr>
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
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");
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/
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");
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/
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");
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/