OVH Cloud OVH Cloud

je dois mal faire

7 réponses
Avatar
bart s.
bsr,

Voila j'utilise la classe BinaryReader pour lire un dictionnaire de 240000
mots avec la methode ReadLine ci-dessous:

class myBinaryReader:BinaryReader
{
public myBinaryReader(String file): base(new FileStream(file,
FileMode.Open),new System.Text.UTF7Encoding())
{
}

public String ReadLine()
{
String s;
Byte b;
Char c;

s="";
b= 0;
while ((this.PeekChar() != -1) && (b != 10))
{
b=this.ReadByte();
if ((b != 13) && (b != 10))
{
c =(Char)b;
s += c.ToString();
}
}

return s;
}
}

je passe sur les bidouilles que j'ai du faire (UTF7Encoding et c =(Char)b)
pour que les accents ne soit pas perdu (mon fichier est codé en ISO-8859-1),
ma question est que la seul lecture de mes 230000 mots prend plus de 30
secondes (le fichier fait 2,7Mo) !

while (dict.PeekChar() != -1)
{
s=dict.ReadLine();
}

cela me parait ENORME, soit je fait une erreur, soit la classe BinaryReader
n'est pas bufferisé (dans ce cas existe-t-il un moyen de la rendre
bufferisé)

Merci

7 réponses

Avatar
Lloyd Dupont
1. Il existe la classe StreamReader qui serait plus approprier dans ton cas
2. StreamReader a d'ailleurs une methode ReadLine()
3. si tu veux absolument utiliser BinaryReader & bufferiser quid de:
new BinaryReader(new BufferedStream(new FileStream(file, FileMode.Open),
Encoding.UTF7)?
rhaaa lala, il etait facile celui la!
GalleryJS

"bart s." wrote in message
news:41a3eae2$0$17760$
bsr,

Voila j'utilise la classe BinaryReader pour lire un dictionnaire de 240000
mots avec la methode ReadLine ci-dessous:

class myBinaryReader:BinaryReader
{
public myBinaryReader(String file): base(new FileStream(file,
FileMode.Open),new System.Text.UTF7Encoding())
{
}

public String ReadLine()
{
String s;
Byte b;
Char c;

s="";
b= 0;
while ((this.PeekChar() != -1) && (b != 10))
{
b=this.ReadByte();
if ((b != 13) && (b != 10))
{
c =(Char)b;
s += c.ToString();
}
}

return s;
}
}

je passe sur les bidouilles que j'ai du faire (UTF7Encoding et c
=(Char)b) pour que les accents ne soit pas perdu (mon fichier est codé en
ISO-8859-1), ma question est que la seul lecture de mes 230000 mots prend
plus de 30 secondes (le fichier fait 2,7Mo) !

while (dict.PeekChar() != -1)
{
s=dict.ReadLine();
}

cela me parait ENORME, soit je fait une erreur, soit la classe
BinaryReader n'est pas bufferisé (dans ce cas existe-t-il un moyen de la
rendre bufferisé)

Merci




Avatar
bart s.
en fait j'avais commencé avec StreamReader, mais qd j'ai vu qu'il me fautait
en l'air mes accents, je me suis dit que j'allais utiliser BinaryReader !

BufferedStream ! c'est ce que je cherchais, malheureusement ca dure encore
17 seconde, je pense que je vais charger tout mon fichier en RAM... mias c
qd meme bizarre la meme en chose en C est quasi instantané !

merci.


"Lloyd Dupont" a écrit dans le message de news:

1. Il existe la classe StreamReader qui serait plus approprier dans ton
cas
2. StreamReader a d'ailleurs une methode ReadLine()
3. si tu veux absolument utiliser BinaryReader & bufferiser quid de:
new BinaryReader(new BufferedStream(new FileStream(file, FileMode.Open),
Encoding.UTF7)?
rhaaa lala, il etait facile celui la!
GalleryJS

"bart s." wrote in message
news:41a3eae2$0$17760$
bsr,

Voila j'utilise la classe BinaryReader pour lire un dictionnaire de
240000 mots avec la methode ReadLine ci-dessous:

class myBinaryReader:BinaryReader
{
public myBinaryReader(String file): base(new FileStream(file,
FileMode.Open),new System.Text.UTF7Encoding())
{
}

public String ReadLine()
{
String s;
Byte b;
Char c;

s="";
b= 0;
while ((this.PeekChar() != -1) && (b != 10))
{
b=this.ReadByte();
if ((b != 13) && (b != 10))
{
c =(Char)b;
s += c.ToString();
}
}

return s;
}
}

je passe sur les bidouilles que j'ai du faire (UTF7Encoding et c
=(Char)b) pour que les accents ne soit pas perdu (mon fichier est codé en
ISO-8859-1), ma question est que la seul lecture de mes 230000 mots prend
plus de 30 secondes (le fichier fait 2,7Mo) !

while (dict.PeekChar() != -1)
{
s=dict.ReadLine();
}

cela me parait ENORME, soit je fait une erreur, soit la classe
BinaryReader n'est pas bufferisé (dans ce cas existe-t-il un moyen de la
rendre bufferisé)

Merci








Avatar
Lloyd Dupont
Alors la c'est bizarre:
1. le StreamReader c'est ce qu'il y a de polus approprier pour lire le
texte, tu pourrais essayer Encoding.ASCII peut-etre?
2. j'ai pas tester personellement mais j'ai deja lu des poste de gens qui
faisait un traitement equivalent au tiens avec de tres bonne performance,
c'est tres bizarre!

"bart s." wrote in message
news:41a47a6e$0$17795$
en fait j'avais commencé avec StreamReader, mais qd j'ai vu qu'il me
fautait en l'air mes accents, je me suis dit que j'allais utiliser
BinaryReader !

BufferedStream ! c'est ce que je cherchais, malheureusement ca dure encore
17 seconde, je pense que je vais charger tout mon fichier en RAM... mias c
qd meme bizarre la meme en chose en C est quasi instantané !

merci.


"Lloyd Dupont" a écrit dans le message de
news:
1. Il existe la classe StreamReader qui serait plus approprier dans ton
cas
2. StreamReader a d'ailleurs une methode ReadLine()
3. si tu veux absolument utiliser BinaryReader & bufferiser quid de:
new BinaryReader(new BufferedStream(new FileStream(file, FileMode.Open),
Encoding.UTF7)?
rhaaa lala, il etait facile celui la!
GalleryJS

"bart s." wrote in message
news:41a3eae2$0$17760$
bsr,

Voila j'utilise la classe BinaryReader pour lire un dictionnaire de
240000 mots avec la methode ReadLine ci-dessous:

class myBinaryReader:BinaryReader
{
public myBinaryReader(String file): base(new FileStream(file,
FileMode.Open),new System.Text.UTF7Encoding())
{
}

public String ReadLine()
{
String s;
Byte b;
Char c;

s="";
b= 0;
while ((this.PeekChar() != -1) && (b != 10))
{
b=this.ReadByte();
if ((b != 13) && (b != 10))
{
c =(Char)b;
s += c.ToString();
}
}

return s;
}
}

je passe sur les bidouilles que j'ai du faire (UTF7Encoding et c
=(Char)b) pour que les accents ne soit pas perdu (mon fichier est codé
en ISO-8859-1), ma question est que la seul lecture de mes 230000 mots
prend plus de 30 secondes (le fichier fait 2,7Mo) !

while (dict.PeekChar() != -1)
{
s=dict.ReadLine();
}

cela me parait ENORME, soit je fait une erreur, soit la classe
BinaryReader n'est pas bufferisé (dans ce cas existe-t-il un moyen de la
rendre bufferisé)

Merci












Avatar
bart s.
ca y est, j'ai utilisé:
StreamReader br = new
StreamReader(file,System.Text.ASCIIEncoding.GetEncoding(1252));

les accents sont correct et la lecture se fait instantanement !

(bizarre qd meme qu'en BinaryReader sa prenne 17 secondes ...)




"Lloyd Dupont" a écrit dans le message de news:

Alors la c'est bizarre:
1. le StreamReader c'est ce qu'il y a de polus approprier pour lire le
texte, tu pourrais essayer Encoding.ASCII peut-etre?
2. j'ai pas tester personellement mais j'ai deja lu des poste de gens qui
faisait un traitement equivalent au tiens avec de tres bonne performance,
c'est tres bizarre!

"bart s." wrote in message
news:41a47a6e$0$17795$
en fait j'avais commencé avec StreamReader, mais qd j'ai vu qu'il me
fautait en l'air mes accents, je me suis dit que j'allais utiliser
BinaryReader !

BufferedStream ! c'est ce que je cherchais, malheureusement ca dure
encore 17 seconde, je pense que je vais charger tout mon fichier en
RAM... mias c qd meme bizarre la meme en chose en C est quasi instantané
!

merci.


"Lloyd Dupont" a écrit dans le message de
news:
1. Il existe la classe StreamReader qui serait plus approprier dans ton
cas
2. StreamReader a d'ailleurs une methode ReadLine()
3. si tu veux absolument utiliser BinaryReader & bufferiser quid de:
new BinaryReader(new BufferedStream(new FileStream(file, FileMode.Open),
Encoding.UTF7)?
rhaaa lala, il etait facile celui la!
GalleryJS

"bart s." wrote in message
news:41a3eae2$0$17760$
bsr,

Voila j'utilise la classe BinaryReader pour lire un dictionnaire de
240000 mots avec la methode ReadLine ci-dessous:

class myBinaryReader:BinaryReader
{
public myBinaryReader(String file): base(new FileStream(file,
FileMode.Open),new System.Text.UTF7Encoding())
{
}

public String ReadLine()
{
String s;
Byte b;
Char c;

s="";
b= 0;
while ((this.PeekChar() != -1) && (b != 10))
{
b=this.ReadByte();
if ((b != 13) && (b != 10))
{
c =(Char)b;
s += c.ToString();
}
}

return s;
}
}

je passe sur les bidouilles que j'ai du faire (UTF7Encoding et c
=(Char)b) pour que les accents ne soit pas perdu (mon fichier est codé
en ISO-8859-1), ma question est que la seul lecture de mes 230000 mots
prend plus de 30 secondes (le fichier fait 2,7Mo) !

while (dict.PeekChar() != -1)
{
s=dict.ReadLine();
}

cela me parait ENORME, soit je fait une erreur, soit la classe
BinaryReader n'est pas bufferisé (dans ce cas existe-t-il un moyen de
la rendre bufferisé)

Merci
















Avatar
Zazar
Bonjour,
ca y est, j'ai utilisé:
StreamReader br = new
StreamReader(file,System.Text.ASCIIEncoding.GetEncoding(1252));

les accents sont correct et la lecture se fait instantanement !

(bizarre qd meme qu'en BinaryReader sa prenne 17 secondes ...)




Si vous utilisez le code posté originalement, c'est normal : entre autres,
vous créez un nouvel objet string à chaque lecture d'un caractère.

Par contre ce que je trouve bizarre c'est qu'en utilisant le BufferedStream,
vous ayez gagné du temps. Vous avez modifié autre chose ? Vous avez mesuré
correctement ? Vous avez fait attention que la deuxième fois le fichier
n'était pas en cache ? Je dis ça car FileStream est déjà bufferisé, et un
coup de reflector permet de vérifier que la taille des buffers par défaut de
FileStrem et de BufferedStream sont identiques. En toute logique, vous
auriez du perdre du temps (trés peu, certainement négligeable), mais pas en
gagner.

--

Zazar
Avatar
bart s.
> Si vous utilisez le code posté originalement, c'est normal : entre autres,
vous créez un nouvel objet string à chaque lecture d'un caractère.



je crois pas ! le code suivant prends 2 secondes (mon fichier fait 2,6Mo):
for(int i=0;i<3000000;i++)

{

String a;

a = i.ToString();

}



Par contre ce que je trouve bizarre c'est qu'en utilisant le
BufferedStream,
vous ayez gagné du temps. Vous avez modifié autre chose ? Vous avez mesuré
correctement ? Vous avez fait attention que la deuxième fois le fichier
n'était pas en cache ?



je confirme, je me suis gouré dans mes tests, le temps est quasi identique.

Je dis ça car FileStream est déjà bufferisé, et un
coup de reflector permet de vérifier que la taille des buffers par défaut
de
FileStrem et de BufferedStream sont identiques. En toute logique, vous
auriez du perdre du temps (trés peu, certainement négligeable), mais pas
en
gagner.



interresant ce reflector je connaisais pas merci.
Avatar
Zazar
>> Si vous utilisez le code posté originalement, c'est normal : entre
autres,
vous créez un nouvel objet string à chaque lecture d'un caractère.



je crois pas ! le code suivant prends 2 secondes (mon fichier fait 2,6Mo):
for(int i=0;i<3000000;i++)

{

String a;

a = i.ToString();

}




Je pensais que c'était ça qui prenait le plus de temps. C'est peut-être la
redondance peekchar/readbyte alors. Il y a des chances que ce soit plus
rapide de ne faire que des readbyte (nettement plus rapide que peeckchar) et
de catcher l'exception. Mais c'est à vérifier. Ensuite il y a les appels aux
fonctions de lecture qui se font octet par octet => 3 millions d'appels.

Sinon dans une moindre mesure, il y a aussi le test b != 10 fait 2 fois.
C'est tout ce que je repère à vue d'oeil. Aprés l'utilisation d'un profiler
permettra de mieux cibler les éventuels autres problèmes.

--

Zazar