Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ouverture de fichier et RAM

    23 juin 2022 à 11:38:16

    Bonjour,

    Il y a-t-il un moyen relativement simple en C d'ouvrir un fichier plus gros que la RAM ?

    Ce serait pour un programme qui travaille sur un fichier contenant quelques milliards de décimales de pi

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter

    Hugo Martin

      23 juin 2022 à 11:51:00

      Bonjour,

      ça dépend de la plateforme, par exemple les unix proposent en général mmap. 

      Sinon il y a plus simple : tu scinde ton énorme fichier en tranches raisonnables …

      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2022 à 12:15:44

        Salut,

        ça dépend beaucoup du type d'accès que tu veux faire dans ton fichier.

        S'il est séquentiel (et je pense que oui vu que ce sont des décimales de PI), alors lis le bloc par bloc (blocs de quelques Mo par exemple) les uns après les autres.

        S'il n'était pas séquentiel, et qu'il faudrait remonter un peu de partout (à coup de fseek) ça vaudrait le coup de chercher des optimisations selon le problème.

        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          23 juin 2022 à 13:01:50

          @HugoHugo21 a écrit :

          "Il y a-t-il un moyen relativement simple en C d'ouvrir un fichier plus gros que la RAM ?"

          S'il s'agit juste d'ouvrir au sens limité de lancer fopen(), cela n'est pas plus problématique que "d'ouvrir" un fichier de taille plus modeste.

          #include <stdio.h>
            
          int main(void) {
                  FILE * pFile;
                  pFile = fopen ("myfile.txt","r");
                  if (pFile != NULL) {
                          printf("myfile.txt opened for reading\n");
                          fclose (pFile);
                  }
                  return 0;
          }

          donne :

          $ gcc -Wall -Wextra 94566101.c
          $ dd if=/dev/urandom of=myfile.txt bs=1024 count=0 seek=1024
          0+0 enregistrements lus
          0+0 enregistrements écrits
          0 octet copié, 0,000327587 s, 0,0 kB/s
          $ ls -alh myfile.txt 
          -rw-r--r-- 1 dlks dlks 1,0M juin  23 12:54 myfile.txt
          $ time ./a.out 
          myfile.txt opened for reading
          
          real	0m0,002s
          user	0m0,002s
          sys	0m0,000s
          $ dd if=/dev/urandom of=myfile.txt bs=1 count=0 seek=1G
          0+0 enregistrements lus
          0+0 enregistrements écrits
          0 octet copié, 0,000304321 s, 0,0 kB/s
          $ ls -alh myfile.txt 
          -rw-r--r-- 1 dlks dlks 1,0G juin  23 12:54 myfile.txt
          $ time ./a.out 
          myfile.txt opened for reading
          
          real	0m0,002s
          user	0m0,002s
          sys	0m0,000s
          
          

          Sur mon Linux Debian, cela prend exactement le même temps "d'ouvrir" un fichier d'un Mo qu'un fichier d'un Go.

          Après, si ta question concerne la lecture et l'exploitation des données contenues dans le fichier, tout dépend de ce que tu veux faire avec les données.

          • Partager sur Facebook
          • Partager sur Twitter
            23 juin 2022 à 20:27:01

            Ouvrir oui, charger c'est différent.

            Sur les systèmes UNIX tu peux profiter de la fonction mmap.

            • Partager sur Facebook
            • Partager sur Twitter

            l'azerty est aux dispositions ce que subversion est aux SCM

            Ouverture de fichier et RAM

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown