Optimisation du code

Optimisation du code - C - Programmation

Marsh Posté le 28-12-2012 à 12:48:06    

salut a tous,  :jap:  
 
Voila en ce moment la je travaille sur projet qui consiste a :
 
Vérifiez mémoire vive du système, à partir de là déterminer la taille maximale des fichiers qu'il peut gérer. (suggérer 10-20% de la fréquence max de RAM) Si le fichier est plus grand que la taille de fichier maximale, fractionnés automatiquement en fichiers temporaires et les utiliser.
 
donc voici la demarche:
 
Ouvrir le fichier
Vérifier la quantité de lignes définissent comme [lignes]
Crée un tableau [lignes]
Chargez toutes les urls dans un tableau
fermer le fichier
 
split.c :

Code :
  1. / *
  2. split.c accueillera les fonctions pour découper les fichiers d'entrée qui sont trop grands.
  3. Cela devrait garder l'utilisation de la mémoire faible.
  4. Taille du fichier(FileSize) max est déterminé par l'entrée d'utilisateur (-m 4096) ou par le programme lui-même s'il n'est pas spécifié
  5. * /
  6. #include <split.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <Windows.h>
  11. int fileSize ( char File[] ); //int pour stocker la taille du fichier
  12. void fileNameExt ( char Name[], char Ext[], char File[] );
  13. int splitmain( int argc, char *argv[] ) //méthode principale
  14. {
  15. FILE *source, *destination; //définir source et la destination des pointeurs de fichiers  
  16. int size, parts; //int pour la taille du fichier de sortie et la quantité de fichiers de sortie
  17. char name[100], ext[100], aux[100];
  18. if( argc < 3 ) //vérifier combien de args ont été entrés
  19. {
  20. printf( "Il n'y a pas suffisamment de args!" );
  21. system( "pause" );
  22. return 0;
  23. }
  24. fileNameExt( name, ext, argv[1] );
  25. parts = atoi( argv[2] );
  26. size = fileSize( argv[1] ); //taille variable = filesize de arg1, le fichier d'entrée.
  27. if( (source = fopen(argv[1], "rb" )) == NULL ) //si fopen renvoie NULL le fichier n'est pas présent, les fichiers vides commence par \ n?
  28. {
  29. printf( "Erreur! Fichier source n'a pas pu être ouvert!" );
  30. system( "pause" );
  31. return 0;
  32. }
  33. for( int i = 0; i < parts; i++ ) //jusqu'à int i est le même que les parties int, boucle.
  34. sprintf( aux, "%s%s-%d", name, ext, i );
  35. printf( "Generating %s file! -- ", aux );
  36. if( (destination = fopen(aux, "wb" )) == NULL ) //si le fichier de destination fopen renvoie NULL alors il n'ya pas de sortie
  37. {
  38. printf( "Errer! fichier de destination %s n'a pas pu etre cree!", aux );
  39. system( "pause" );
  40. return 0;
  41. }
  42. char car = getc( source );
  43. for( int j = 0; j < size/parts && !feof(source); j++ )
  44. {
  45. putc( car, destination );
  46. car = getc( source );
  47. }
  48. printf( "OK!
  49. " );
  50. fclose( destination );
  51. }
  52. fclose( source );
  53. system( "pause" );
  54. return 0;
  55. }
  56. int fileSize( char File[] ) //calculer la taille du fichier
  57. {
  58. FILE *f; //initier pointeur du fichier
  59. if( (f = fopen(File,"rb" )) == NULL ) //si fopen renvoie NULL le fichier n'est pas présent, les fichiers vides commence par \n?
  60. {
  61. printf( "Erreur! Fichier source n'a pas pu être ouvert!" );
  62. system( "pause" );
  63. return 0;
  64. }
  65. fseek( f, 0,SEEK_END );
  66. int sz = ftell(f);
  67. fclose( f );
  68. return sz;
  69. }
  70. void fileNameExt( char Name[], char Ext[], char File[] )
  71. {
  72. char *aux;
  73. if( (aux = strrchr(File, '')) == NULL )
  74. {
  75. if( (aux = strrchr( File, '/' )) == NULL)
  76. {
  77. aux = File;
  78. }
  79. }
  80. if( aux != File )
  81. {
  82. aux++;
  83. }
  84. for( int i = 0; *aux != '.'; i++, aux++ )
  85. {
  86. Name[i] = *aux;
  87. Name[i+1] = '\0;';
  88. }
  89. for( int i = 0; *aux != '\0;'; i++, aux++ )
  90. {
  91. Ext[i] = *aux;
  92. Ext[i+1] = '\0';
  93. }
  94. }


 
split.h :
 

Code :
  1. #ifndef SPLIT_H_INCLUDED
  2. #define SPLIT_H_INCLUDED
  3. /* Prototypes des fonctions */
  4. /* split main() */
  5. int splitmain( int argc, char *argv[] );
  6. /* calculer la taille de fichier */
  7. int fileSize( char File[] );
  8. /* */
  9. void fileNameExt( char Name[], char Ext[], char File[] );
  10. #endif


 
defhaze.c :
 

Code :
  1. #include <conio.h>
  2. #include <dos.h> 
  3. #include <process.h> 
  4. #include <stdio.h>
  5. #include <split.h>
  6.     int main(int argc, char *argv[])
  7.     { 
  8.         printf(" /*****Bienvenu a De(f)haze*****\ \n" );
  9.         printf(" |           | \n" );
  10.         printf(" |       Fait par Luloo         | \n" );
  11.         printf(" |                              | \n" );
  12.         printf(" |                              | \n" );
  13.         printf(" \*****--------------------*****/ \n" );
  14.         int suc6 = 0;
  15.         loadfile();
  16.         return 0;
  17.      }
  18.      
  19.       int loadfile() //Méthode pour charger le fichier d'entrée dans un tableau
  20.       {
  21.         inputfile = ; //attribuer une valeur à fichier d'entrée
  22. FILE *fpinput; //définir pointeur du fichier d'entrée
  23.         fpinput=fopen(“&inputfile”, ”r”); //ouvrir le fichier d'entrée avec mode "r", lecture seule(read only)
  24.         //fp = fopen("filename.txt", "r" );
  25. printf("Le comptage et la collecte des urls ... \n" );
  26. while((fgets(fp)) != NULL) //tandis que la rangée / ligne ne renvoie pas NULL (espace ou \n !=NULL), urls++
  27.          {
  28.            urls++;
  29.          } 
  30.         return 0;
  31.   }
  32.         for(int i=0; i<urls; i++) //tandis que i est inférieur au montant des urls, tourne en boucle
  33.         fscanf(fp, "%d %s\n", &UrlArr[i]); //ajouter une ligne au tableau
  34. fclose(fpinput); //fermez le fichier puisque les urls sont déjà dans le tableau
  35.       }
  36. /*
  37. Méthode Append ajoutera les injections réussies dans le fichier de sortie si dans le cas d'un crash ou quoi que vous aurez toujours vos injections réussies
  38. */
  39. int apppend()
  40. {
  41. FILE *fpoutput; //définir pointeur du fichier de sortie
  42. fpoutput = fopen("output.txt", "a" ); //Inclure dans le fichier de sortie
  43. if (suc6 <1)
  44. {
  45. struct date d;
  46. getdate(&d);
  47. fwrite("fpoutput", "De(f)haze started [%d/%d/%d",d.da_day,d.da_mon,d.da_year]\n" );
  48. fwrite("fpoutput", "Codee par Luloo \n" );
  49. }
  50. }


 
voila mon probleme cest que je trouve que mon code est un peu mal structure et incomplet
 
donc en gros, jaimerai avoir quelques idees concernant l'optimisation de mon code et si possible corriger quelques fautes  :whistle:

Reply

Marsh Posté le 28-12-2012 à 12:48:06   

Reply

Marsh Posté le 28-12-2012 à 15:40:26    

lulooo a écrit :

Vérifiez mémoire vive du système, à partir de là déterminer la taille maximale des fichiers qu'il peut gérer. (suggérer 10-20% de la fréquence max de RAM) Si le fichier est plus grand que la taille de fichier maximale, fractionnés automatiquement en fichiers temporaires et les utiliser.

Au cas ou ça t'intéresse, sous Windows, on peut procéder ainsi (code pour gcc):

Code :
  1. // voir http://msdn.microsoft.com/en-us/li [...] s.85).aspx
  2. #define _WIN32_WINNT  0x0501 // Donc au moins au niveau de WinXP
  3. #include <windows.h>
  4. #include <stdio.h>
  5. int main()
  6. {
  7.     // voir http://msdn.microsoft.com/en-us/li [...] s.85).aspx
  8.     MEMORYSTATUSEX statex;
  9.     statex.dwLength = sizeof(statex);
  10.     GlobalMemoryStatusEx(&statex);
  11.     printf("Memoire physique: %llu Bytes\n", statex.ullTotalPhys/1024);
  12.     printf("Memoire physique utilisable: %llu Bytes\n", statex.ullAvailPhys/1024);
  13.     return 0;
  14. }


et sous Linux, l'info est à lire dans /proc/meminfo  (elle est minorée, car le système peut vider ses caches pour fournir un peu plus de mémoire si nécessaire)
A+,


Message édité par gilou le 28-12-2012 à 18:45:45

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 30-12-2012 à 22:33:56    

lulooo a écrit :

voila mon probleme cest que je trouve que mon code est un peu mal structure et incomplet


Bonsoir
 
Je crois que ton indentation anarchique y est aussi pour beaucoup...
 

lulooo a écrit :

Code :
  1. void fileNameExt( char Name[], char Ext[], char File[] )
  2. {
  3. char *aux;
  4. if( (aux = strrchr(File, '')) == NULL )
  5. {
  6. if( (aux = strrchr( File, '/' )) == NULL)
  7. {
  8. aux = File;
  9. }
  10. }
  11.     int main(int argc, char *argv[])
  12.     { 
  13.         printf(" /*****Bienvenu a De(f)haze*****\ \n" );
  14.         printf(" |           | \n" );
  15.         printf(" |       Fait par Luloo         | \n" );
  16.         printf(" |                              | \n" );
  17.         printf(" |                              | \n" );
  18.         printf(" \*****--------------------*****/ \n" );
  19.         int suc6 = 0;
  20.         loadfile();
  21.         return 0;
  22.      }
  23.      
  24.       int loadfile() //Méthode pour charger le fichier d'entrée dans un tableau
  25.       {
  26.         inputfile = ; //attribuer une valeur à fichier d'entrée
  27. FILE *fpinput; //définir pointeur du fichier d'entrée
  28.         fpinput=fopen(“&inputfile”, ”r”); //ouvrir le fichier d'entrée avec mode "r", lecture seule(read only)
  29.         //fp = fopen("filename.txt", "r" );
  30. printf("Le comptage et la collecte des urls ... \n" );
  31. while((fgets(fp)) != NULL) //tandis que la rangée / ligne ne renvoie pas NULL (espace ou \n !=NULL), urls++
  32.          {
  33.            urls++;
  34.          } 
  35.         return 0;
  36.   }
  37.         for(int i=0; i<urls; i++) //tandis que i est inférieur au montant des urls, tourne en boucle
  38.         fscanf(fp, "%d %s\n", &UrlArr[i]); //ajouter une ligne au tableau
  39. fclose(fpinput); //fermez le fichier puisque les urls sont déjà dans le tableau
  40.       }



Juste cet exemple. Tu crois qu'on perçoit facilement l'organisation de la fonction fileNameExt avec tout son code écrit en début de ligne. Inversement le main, lui, se trouve bizarrement et inexplicablement décalé. Et enfin ces 3 dernières lignes qui me semblent situées en dehors de toute fonction...
 
Donc déjà commence par bien écrire proprement ton code, tu y gagneras en lisibilité et nous aussi...


Message édité par Sve@r le 30-12-2012 à 22:35:27
Reply

Marsh Posté le 31-12-2012 à 09:43:43    

@sver >> Il y a un gros problème d'indentation. j'ai copié/collé la semaine dernière un code bien indenté sous VS2010 qui s'est retrouvé écrabouillé ici, je pense que ce sont les tab qui ne sont pas transformé en espaces. Je n'ai pas eu le courage de tout refaire surtout que lorsqu'il est copié l'affichage est correct, c'est dans l'affichage terminal de la page qu'il y a problème

Reply

Marsh Posté le 31-12-2012 à 11:32:56    

Tu formates le tout avec le plugin qui va bien de Code::Blocks, tu colles ici et ça roule.
C'est ce que je fais pour mon code, son indentation sous emacs n'étant pas compatible avec le formatage du forum.
En appliquant ceci au code que tu as posté, on voit qu'il est faux: splitmain fermé trop tôt manifestement.

Code :
  1. / *
  2. split.c accueillera les fonctions pour découper les fichiers d'entrée qui sont trop grands.
  3. Cela devrait garder l'utilisation de la mémoire faible.
  4. Taille du fichier(FileSize) max est déterminé par l'entrée d'utilisateur (-m 4096) ou par le programme lui-même s'il n'est pas spécifié
  5. * /
  6. #include <split.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <Windows.h>
  11. int fileSize ( char File[] ); //int pour stocker la taille du fichier
  12. void fileNameExt ( char Name[], char Ext[], char File[] );
  13. int splitmain( int argc, char *argv[] ) //méthode principale
  14. {
  15.     FILE *source, *destination; //définir source et la destination des pointeurs de fichiers
  16.     int size, parts; //int pour la taille du fichier de sortie et la quantité de fichiers de sortie
  17.     char name[100], ext[100], aux[100];
  18.     if( argc < 3 ) { //vérifier combien de args ont été entrés
  19.         printf( "Il n'y a pas suffisamment de args!" );
  20.         system( "pause" );
  21.         return 0;
  22.     }
  23.     fileNameExt( name, ext, argv[1] );
  24.     parts = atoi( argv[2] );
  25.     size = fileSize( argv[1] ); //taille variable = filesize de arg1, le fichier d'entrée.
  26.     if( (source = fopen(argv[1], "rb" )) == NULL ) { //si fopen renvoie NULL le fichier n'est pas présent, les fichiers vides commence par \ n?
  27.         printf( "Erreur! Fichier source n'a pas pu être ouvert!" );
  28.         system( "pause" );
  29.         return 0;
  30.     }
  31.     for( int i = 0; i < parts; i++ ) { //jusqu'à int i est le même que les parties int, boucle.
  32.         sprintf( aux, "%s%s-%d", name, ext, i );
  33.     }
  34.     printf( "Generating %s file! -- ", aux );
  35.     if( (destination = fopen(aux, "wb" )) == NULL ) { //si le fichier de destination fopen renvoie NULL alors il n'ya pas de sortie
  36.         printf( "Errer! fichier de destination %s n'a pas pu etre cree!", aux );
  37.         system( "pause" );
  38.         return 0;
  39.     }
  40.     char car = getc( source );
  41.     for( int j = 0; j < size/parts && !feof(source); j++ ) {
  42.         putc( car, destination );
  43.         car = getc( source );
  44.     }
  45.     printf( "OK!
  46.             " );
  47.     fclose( destination );
  48. }
  49. fclose( source );
  50. system( "pause" );
  51. return 0;
  52. }
  53. int fileSize( char File[] ) //calculer la taille du fichier
  54. {
  55.     FILE *f; //initier pointeur du fichier
  56.     if( (f = fopen(File,"rb" )) == NULL ) { //si fopen renvoie NULL le fichier n'est pas présent, les fichiers vides commence par \n?
  57.         printf( "Erreur! Fichier source n'a pas pu être ouvert!" );
  58.         system( "pause" );
  59.         return 0;
  60.     }
  61.     fseek( f, 0,SEEK_END );
  62.     int sz = ftell(f);
  63.     fclose( f );
  64.     return sz;
  65. }
  66. void fileNameExt( char Name[], char Ext[], char File[] )
  67. {
  68.     char *aux;
  69.     if( (aux = strrchr(File, '')) == NULL ) {
  70.         if( (aux = strrchr( File, '/' )) == NULL) {
  71.             aux = File;
  72.         }
  73.     }
  74.     if( aux != File ) {
  75.         aux++;
  76.     }
  77.     for( int i = 0; *aux != '.'; i++, aux++ ) {
  78.         Name[i] = *aux;
  79.         Name[i+1] = '\0;';
  80.     }
  81.     for( int i = 0; *aux != '\0;'; i++, aux++ ) {
  82.         Ext[i] = *aux;
  83.         Ext[i+1] = '\0';
  84.     }
  85. }
 

Et ici pareil, loadfile est fermée trop tôt manifestement, ou alors il manque un début à ce qui la suit.

Code :
  1. #include <conio.h>
  2. #include <dos.h>
  3. #include <process.h>
  4. #include <stdio.h>
  5. #include <split.h>
  6. int main(int argc, char *argv[])
  7. {
  8.     printf(" /*****Bienvenu a De(f)haze*****\ \n" );
  9.     printf(" |           | \n" );
  10.     printf(" |       Fait par Luloo         | \n" );
  11.     printf(" |                              | \n" );
  12.     printf(" |                              | \n" );
  13.     printf(" \*****--------------------*****/ \n" );
  14.     int suc6 = 0;
  15.     loadfile();
  16.     return 0;
  17. }
  18. int loadfile() //Méthode pour charger le fichier d'entrée dans un tableau
  19. {
  20.     inputfile = ; //attribuer une valeur à  fichier d'entrée
  21.     FILE *fpinput; //définir pointeur du fichier d'entrée
  22.     fpinput=fopen(“&inputfile”, ”r”); //ouvrir le fichier d'entrée avec mode "r", lecture seule(read only)
  23.     //fp = fopen("filename.txt", "r" );
  24.     printf("Le comptage et la collecte des urls ... \n" );
  25.     while((fgets(fp)) != NULL) { //tandis que la rangée / ligne ne renvoie pas NULL (espace ou \n !=NULL), urls++
  26.         urls++;
  27.     }
  28.     return 0;
  29. }
  30. for(int i=0; i<urls; i++) //tandis que i est inférieur au montant des urls, tourne en boucle
  31. {
  32.     fscanf(fp, "%d %s\n", &UrlArr[i]);    //ajouter une ligne au tableau
  33. }
  34. fclose(fpinput); //fermez le fichier puisque les urls sont déjà  dans le tableau
  35. }
  36. /*
  37.   Méthode Append ajoutera les injections réussies dans le fichier de sortie si dans le cas d'un crash ou quoi que vous aurez toujours vos injections réussies
  38. */
  39. int apppend()
  40. {
  41.     FILE *fpoutput; //définir pointeur du fichier de sortie
  42.     fpoutput = fopen("output.txt", "a" ); //Inclure dans le fichier de sortie
  43.     if (suc6 <1) {
  44.         struct date d;
  45.         getdate(&d);
  46.         fwrite("fpoutput", "De(f)haze started [%d/%d/%d",d.da_day,d.da_mon,d.da_year]\n" );
  47.         fwrite("fpoutput", "Codee par Luloo \n" );
  48.     }
  49.     }


A+,


Message édité par gilou le 01-01-2013 à 13:47:13

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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