2016-11-20 5 views
0

Supposons que j'ai un fichier .txt d'une taille de 9 Go. Et je ne veux que lire le n'th MB. (Je sais ce qui est n). Mais mon ordinateur n'a que 4 Go de RAM, donc je ne peux pas charger tout le fichier à la fois. J'ai besoin d'accéder à plusieurs n différents. Quelle est la meilleure façon de faire cela (je ne sais pas si le standart ifstream est capable de faire ce genre de choses).Lecture de fichiers volumineux en C++

Répondre

1

Vous souhaitez "rechercher" dans le fichier à un emplacement spécifié. En C++ en utilisant ifstream vous utilisez seekg(): http://www.cplusplus.com/reference/istream/istream/seekg/

Par exemple:

char data[1024*1024]; 
ifstream in("myfile.txt"); 
in.seekg(450 * 1024 * 1024, ios_base::beg); // skip 450 MB 
if (in.read(data, sizeof(data)) { 
    // use data 
} 
+0

Rappelez-vous simplement que 'données char [1024 * 1024]' allouera 1Mo sur la pile qui pourrait poser un problème en fonction de votre taille de la pile. Pour les allocations plus importantes, il est préférable d'utiliser heap. Pour ce faire, changez simplement la ligne en 'char * data = new char [1024 * 1024]'. –

+1

@JosipVujcic: J'étais avec vous jusqu'à ce que vous utilisiez 'new'. En C++ 14, nous pouvons utiliser 'make_unique (1024 * 1024)'; en C++ 98 'std :: vecteur données (1024 * 1024)'. –

+0

Je voulais juste signaler les problèmes possibles et donner une solution simple. Je suis d'accord avec vous que l'utilisation de pointeurs intelligents (en C++ 14) est la meilleure façon de le faire. –

0

Est-ce votre système d'exploitation 64 bits? Si c'est le cas, essayez mmap().

Sur les systèmes d'exploitation modernes, il est possible de mmapper (prononcé « em-carte ») un fichier dans une région de la mémoire. Lorsque cela est fait, le fichier est accessible comme un tableau dans le programme.

Ceci est plus efficace que la lecture ou l'écriture, car seules les régions du fichier auxquelles un programme accède sont chargées. Les accès à parties non encore chargées de la région mapped sont traitées de la même manière que les pages permutées. Étant donné que les pages mouillées peuvent être stockées dans leur fichier lorsque la mémoire physique est faible, il est possible de mmap fichiers de plus grande taille que la mémoire physique et l'espace de swap. La seule limite est l'espace d'adressage. La limite théorique est de 4 Go sur une machine 32 bits - Cependant, la limite réelle sera plus petite puisque certaines zones seront réservées à d'autres fins. Si l'interface LFS est utilisée, la taille du fichier sur les systèmes 32 bits n'est pas limitée à 2 Go (les décalages sont signés, réduit de moitié la zone adressable de 4 Go); les 64 bits complets sont disponibles.

Le mappage de la mémoire ne fonctionne que sur des pages entières de la mémoire. Ainsi, les adresses pour le mappage doivent être alignées sur les pages et les valeurs de longueur seront arrondies à .

Plus d'infos: