Comment lire énorme fichier en c++
Si j'ai un énorme fichier (par exemple. 1 TO, ou de n'importe quelle taille qui ne rentre pas dans la RAM. Le fichier est stocké sur le disque). Il est délimité par l'espace. Et ma RAM est à seulement 8 GO. Puis-je lire ce fichier dans ifstream? Si non, comment faire pour lire un bloc de fichier (par exemple. 4 GO)?
Comment est-il délimité? Il est orienté ligne de texte? Pouvez-vous lire une ligne à la fois?
Je doute que l'on pourrait avoir un fichier de texte de taille de 1 to.
Il n'existe aucun moyen. Vous ne pouvez pas mettre de 1 to de mémoire RAM de moins. Si vous voulez extraire des données à partir de ce fichier, il pourrait être possible.
Avez-vous essayé de le lire? Si non, pourquoi pas? Si vous l'avez fait, ce qui n'a pas de travail?
Souhaitez-moi de vous en envoyer un?
Je doute que l'on pourrait avoir un fichier de texte de taille de 1 to.
Il n'existe aucun moyen. Vous ne pouvez pas mettre de 1 to de mémoire RAM de moins. Si vous voulez extraire des données à partir de ce fichier, il pourrait être possible.
Avez-vous essayé de le lire? Si non, pourquoi pas? Si vous l'avez fait, ce qui n'a pas de travail?
Souhaitez-moi de vous en envoyer un?
OriginalL'auteur ZigZagZebra | 2016-01-12
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de choses que vous pouvez faire.
Tout d'abord, il n'y a pas de problème à l'ouverture d'un fichier de plus de la quantité de RAM que vous avez. Ce que vous ne serez pas en mesure de faire est de copier l'ensemble du fichier vivre dans votre mémoire. Le mieux serait pour vous de trouver un moyen de lire quelques morceaux à la fois et de les traiter. Vous pouvez utiliser
ifstream
à cet effet (avecifstream.lire
, par exemple). Allouer, disons, un mégaoctet de mémoire, lire le premier mégaoctet de ce fichier, rincer et répéter:Une autre solution est de mapper le fichier en mémoire. La plupart des systèmes d'exploitation vous permettent de mapper un fichier dans la mémoire, même si elle est plus grande que la quantité de mémoire physique que vous avez. Cela fonctionne parce que le système d'exploitation sait que chaque page de mémoire associé avec le fichier peut être mappé et non mappés à la demande: lorsque votre programme a besoin d'une page spécifique, le système d'exploitation le lire à partir du fichier dans votre processus de la mémoire et du swap sur une page qui n'a pas été utilisé pendant un certain temps.
Cependant, ceci ne peut fonctionner que si le fichier est plus petite que la quantité maximale de mémoire que votre processus peut théoriquement utiliser. Ce n'est pas un problème avec 1TO de fichier dans un processus 64 bits, mais il ne fonctionne pas dans un processus 32 bits.
Aussi être conscient des esprits que vous êtes d'invocation. Projection en mémoire d'un fichier n'est pas la même chose que de le lire. Si le fichier est brusquement tronqué à partir d'un autre programme, votre programme est susceptible de se bloquer. Si vous modifiez les données, il est possible que vous serez à court de mémoire si vous ne pouvez pas enregistrer sur le disque. Aussi, votre système d'exploitation de l'algorithme utilisé pour la pagination dans et hors de la mémoire peut ne pas se comporter d'une manière qui avantage considérablement. En raison de ces incertitudes, je considère la cartographie du fichier seulement si la lecture en morceaux à l'aide de la première solution ne peut pas travailler.
Sur Linux/OS X, vous pouvez utiliser
mmap
. Sur Windows, vous ouvrez un fichier, puis l'utiliserCreateFileMapping
puisMapViewOfFile
.while (bigFile) { bigFile.read(...); ... }
OriginalL'auteur zneak
Je suis sûr que vous n'avez pas à garder tout le fichier en mémoire. Généralement on veut lire et traiter les fichiers par morceaux. Si vous souhaitez utiliser
ifstream
, vous pouvez faire quelque chose comme ça:OriginalL'auteur Oleg Andriyanov
Un plus avancées approche est d'au lieu de lire tout le fichier ou de ses morceaux dans la mémoire vous pouvez carte mémoire à l'aide de la plate-forme api:
Sous windows: CreateFileMapping(), MapViewOfFile()
Sous linux: open(2) /creat(2), shm_open, mmap
vous aurez besoin de compiler en 64 bits app pour le faire fonctionner.
pour plus de détails voir ici: CreateFileMapping, MapViewOfFile, comment faire pour éviter de tenir en place le système de mémoire
OriginalL'auteur marcinj
Vous pouvez utiliser fread
Ou, si vous voulez utiliser le C++ fstreams vous pouvez utiliser lire comme buratino dit.
Également avoir à l'esprit que vous pouvez ouvrir un fichier quelle que soit sa taille, l'idée est de l'ouvrir et de le lire dans un mandrin qui s'inscrivent dans la mémoire RAM.
ifstream
. Je crois qu'un des plus pertinentes de l'appel de fonction serait de lireJ'ai lu fread doc. Donc, si j'utilise
FILE * pFile; pFile = fopen ( "myfile.txt" , "rb" );
et myfile.txt ne peut pas être en forme dans la RAM, je peux toujours l'ouvrir de cette façon?fopen ne charge pas le fichier dans la ram, donc oui, vous devriez être en mesure de le faire sans problèmes.
OriginalL'auteur marian0