ç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.
"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.
Sur les systèmes UNIX tu peux profiter de la fonction mmap.
git is great because Linus did it, mercurial is better because he didn't.
Ouverture de fichier et RAM
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Hugo Martin
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
git is great because Linus did it, mercurial is better because he didn't.