[WIN32] copie de DVD plutot lente

copie de DVD plutot lente [WIN32] - C - Programmation

Marsh Posté le 19-03-2004 à 12:21:16    

salut,
 
j'ai une application qui doit entre autre copier l integralité du contenu d'un DVD sur disque dur. J'ai donc ecrit un premier algorithme intuitif mais bizarrement c est tres lent.
 
En gros pour un DVD de 8GO, j'ai mis 6200 sec soit une moyenne de 1,2 MO / sec (environ), ce qui n est pas du tout la vitesse du lecteur DVD. En copiant par l explorateur, c est beaucoup plus rapide.
 
il y a donc une subtilité que je n'ai pas compris ou une affreuse erreur dans mon algo.
 
 
voici le code  
 

Code :
  1. unsigned char *buf2;
  2. buf2 = new unsigned char[BUFFER_SIZE]; // ici 5 MO
  3. f = fopen(pBuffer,"rb" );
  4. f2 = fopen(pBuffer2,"wb" );
  5. while (iiFileSize != 0) {
  6.   ret = fread(buf,1,bufferSize,f);
  7.   iiFileSize = (__int64)iiFileSize - (__int64)ret; // iiFileSize de type __int64 et initialisée a la taille du fichier
  8.   fwrite(buf,1,ret,f2);
  9. }
  10. fclose(f);
  11. fclose(f2);
  12. delete []buf;


 
Peut etre faut-il donner une priorité plus grande au thread de copie ?
 
merci :)
 
 

Reply

Marsh Posté le 19-03-2004 à 12:21:16   

Reply

Marsh Posté le 19-03-2004 à 13:46:04    

Je ne sais pas si ton code est complet mais il y a apparemment des problèmes dans le nom de tes variables :
 
buf2 = new ...
fread(buf,...
delete []buf;
 
buf n'est pas une variable qui existerait également ?
 
bufferSize a été initialisé avec la valeur de BUFFER_SIZE ?

Reply

Marsh Posté le 19-03-2004 à 13:48:43    

Sinon niveau perfs je ne sais pas trop. L'inconvénient ici est que pendant que tu écris sur le disque, tu ne lis plus rien sur le dvd. Idem quand tu lis sur le dvd tu attends pour écrire sur le disque dur.

Reply

Marsh Posté le 19-03-2004 à 13:51:22    

Pourquoi ne pas utiliser directement la fonction win32 qui permet la copie d'un fichier ?
 
The CopyFile function copies an existing file to a new file.  
 
BOOL CopyFile(
  LPCTSTR lpExistingFileName,
                          // pointer to name of an existing file
  LPCTSTR lpNewFileName,  // pointer to filename to copy to
  BOOL bFailIfExists      // flag for operation if file exists
);


Message édité par Vinx le 19-03-2004 à 13:54:40
Reply

Marsh Posté le 19-03-2004 à 13:54:19    

Vinx a écrit :

Sinon niveau perfs je ne sais pas trop. L'inconvénient ici est que pendant que tu écris sur le disque, tu ne lis plus rien sur le dvd. Idem quand tu lis sur le dvd tu attends pour écrire sur le disque dur.


 
heu a part avec des threads jvois pas trop comment y pourrait faire puis faudra encore synchroniser tout ca
 
faudrait voir du cote de lapi si ya pas qqch de tout fait
 
sinon essaie des differentes taille pour le buffer ya certainement moyen de faire mieux
 
 
EDIT : grilled by vinx   [:shooter]


Message édité par red faction le 19-03-2004 à 14:23:37
Reply

Marsh Posté le 19-03-2004 à 14:18:21    

Vinx a écrit :

Pourquoi ne pas utiliser directement la fonction win32 qui permet la copie d'un fichier ?
 
The CopyFile function copies an existing file to a new file.  
 
BOOL CopyFile(
  LPCTSTR lpExistingFileName,
                          // pointer to name of an existing file
  LPCTSTR lpNewFileName,  // pointer to filename to copy to
  BOOL bFailIfExists      // flag for operation if file exists
);
 


arf chui grave, faut toujours que je reinvente la roue.
 
 
Pour la variable, c est une erreur de recopie :) c etait bien buf et non buf2.
 
Bon je vais essayer ca :)  
 

Reply

Marsh Posté le 19-03-2004 à 16:19:28    

bon ca met 2626 sec avec la fonction CopyFile. Il faut quand meme 45 mn pour copier un DVD completement. Ca fait du 3MO /sec je trouve ca pas tres rapide pour un DVD censé aller en 16X (2,5MO le 1X il me semble).

Reply

Marsh Posté le 19-03-2004 à 16:22:50    

Vinx a écrit :

Sinon niveau perfs je ne sais pas trop. L'inconvénient ici est que pendant que tu écris sur le disque, tu ne lis plus rien sur le dvd. Idem quand tu lis sur le dvd tu attends pour écrire sur le disque dur.

c'est pour ça que y a un truc en dessous qui s'appelle OS qui est sensé faire le boulot. apparemment ça n'est pas le cas

Reply

Marsh Posté le 19-03-2004 à 16:30:59    

Vinx a écrit :

Sinon niveau perfs je ne sais pas trop. L'inconvénient ici est que pendant que tu écris sur le disque, tu ne lis plus rien sur le dvd. Idem quand tu lis sur le dvd tu attends pour écrire sur le disque dur.


 
pas bete, j avais zappé ce message...

Reply

Marsh Posté le 19-03-2004 à 17:16:24    

Citation :

heu a part avec des threads jvois pas trop comment y pourrait faire puis faudra encore synchroniser tout ca


En travaillant en asynchrone (Overlapped IO, CompletionRoutine).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 19-03-2004 à 17:16:24   

Reply

Marsh Posté le 23-03-2004 à 10:39:55    

Ok. Bon j'ai un autre probleme (en fait 2). Lorsque j'insere le DVD (avec detection par windows XP) puis mon programme de copie ca marche sans probleme.  
Par contre si le DVD est deja dedans et que je reboote puis lance le programme de copie, il ne voit aucun fichier. Je suis obligé d ejecter puis de remettre le DVD. Apparemment, il y a quelque chose a faire mais je ne sais pas quoi :(
 
Par ailleurs, existe-t-il une notification comme quoi un CD/DVD a été inséré ?

Reply

Marsh Posté le 24-03-2004 à 13:55:03    

ptit up au cas zou

Reply

Marsh Posté le 24-03-2004 à 14:03:48    

Avec ton code de copie qui est dans le premier post, la taille du fichier n'est pas préallouée ce qui peut donner un fichier fragmenté. Ça réduit aussi les performances.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-03-2004 à 14:11:56    

antp a écrit :

Avec ton code de copie qui est dans le premier post, la taille du fichier n'est pas préallouée ce qui peut donner un fichier fragmenté. Ça réduit aussi les performances.
 

:whistle:

Reply

Marsh Posté le 24-03-2004 à 14:14:09    


 
Si Linux bouge les bouts de fichiers chaque fois que ça s'agrandit ça doit pas être top pour les performances non plus :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-03-2004 à 15:43:28    

Citation :

bon ca met 2626 sec avec la fonction CopyFile. Il faut quand meme 45 mn pour copier un DVD completement. Ca fait du 3MO /sec je trouve ca pas tres rapide pour un DVD censé aller en 16X (2,5MO le 1X il me semble).


Depuis l'explorer ça met combien de temps ?
Apparement 1X c'est plutot 1.38 Mo/sec. Ca ferait un peu plus de 2X de moyenne.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 24-03-2004 à 16:32:08    

antp a écrit :


 
Si Linux bouge les bouts de fichiers chaque fois que ça s'agrandit ça doit pas être top pour les performances non plus :o

on a pas du lire les mêmes documentations alors ...
 
et tu ferais comment pour préallouer un gros fichier  :heink: ?

Reply

Marsh Posté le 24-03-2004 à 16:37:07    

Taz a écrit :

on a pas du lire les mêmes documentations alors ...


 
J'ai lu aucune doc, je suppose qu'il fait ça. Parce que s'il ne bouge pas un bloc quand l'espace est plein je vois pas comment il évite la fragmentation
 

Taz a écrit :


et tu ferais comment pour préallouer un gros fichier  :heink: ?


 
En Win32 t'as un truc genre SetEndOfFile.
Il doit y avoir d'autres moyens.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-03-2004 à 16:41:50    

Apparemment la fonction copyfile alloue la taille max des le debut (mon fichier fait 800 MO des le debut de la copie). Mais c est quand meme bizarre que la copie soit si lente meme avec la fonction CopyFile.

Reply

Marsh Posté le 24-03-2004 à 16:43:52    

Citation :


J'ai lu aucune doc, je suppose qu'il fait ça. Parce que s'il ne bouge pas un bloc quand l'espace est plein je vois pas comment il évite la fragmentation


Il ne boge rien. J'avais aussi cherché à comprendre pkoi le fs de Linux n'a pas besoin d'être défragmenté :
- 1 : parce que la fragmentation n'est pas trop problématique en multiuser (si si on m'a dit ça)
- 2 : la vrai raison, c'est que le cache manager se démerde pour l'éviter. Ca voudrait dire qu'il écrit le moins possible sur disque, ça + le fait que Linux tourne h24 car il reboot jamais, hop y'a pas de fragmentation.
Je suis pas convaincu que dans une utilisation monoutilisateur classique ou le PC est rebooté tous les jours qu'il n'y ai pas de fragmentation.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 24-03-2004 à 16:44:35    

Citation :

Apparemment la fonction copyfile alloue la taille max des le debut (mon fichier fait 800 MO des le debut de la copie). Mais c est quand meme bizarre que la copie soit si lente meme avec la fonction CopyFile.


Et depuis l'explorer combien de temps ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 24-03-2004 à 16:46:35    

ben comme déjà dit, fais des écritures non-bloquantes, du moins qui ne bloquent pas ton fil d'exécution qui lit les données
 
 
cela dit : je trouve ça bizarre que Windows^W^W^W normal que Windows n'est pas un mécanisme de cache évolué qui te permettent de ne pas te soucier de tout ça


Message édité par Taz le 24-03-2004 à 16:49:38
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed