6
votes

Fread échoue-t-il pour de gros fichiers?

Je dois analyser un fichier de 16 Go. Je lis dans le fichier séquentiellement à l'aide de Fread () et fseek () . Est-ce réalisable? Fread () fonctionne pour un fichier aussi grand?


3 commentaires

Pouvez-vous clarifier la langue utilisée?


Je vais aller de l'avant et deviner c


Faites-ils des fread et Fsek existent même comme des normes dans une autre langue?


5 Réponses :


2
votes

Cela dépend de ce que vous voulez faire. Si vous souhaitez lire l'ensemble de 16 Go de données en mémoire, il est probable que vous risquez de sortir de la mémoire ou du tas d'applications.

Plutôt lire le morceau de données par le morceau et le traitement de ces morceaux (et des ressources libres lorsque vous avez terminé).

Mais, outre tout cela, décidez quelle approche que vous souhaitez faire (en utilisant Fread () ou istream , etc.) et faites quelques cas de test pour voir les travaux mieux pour vous.


0 commentaires

3
votes

Si mis en œuvre correctement, cela ne devrait pas être un problème. Je suppose par séquentiellement, vous voulez dire que vous regardez le fichier dans des morceaux discrets et de faire avancer votre pointeur de fichier.

Consultez http: / /wwww.computing.net/answers/programmer/us-fread-with-a-large-file-/10254.html

On dirait qu'il faisait presque la même chose que vous.


0 commentaires

6
votes

Vous ne mentionnez pas une langue, alors je vais supposer c.

Je ne vois aucun problème avec Fread , mais fseek et ftell peut avoir des problèmes.

Ces fonctions utilisent long int comme type de données pour maintenir la position de fichier, plutôt que quelque chose d'intelligent comme FPOS_T ou même taille_t . Cela signifie qu'ils ne peuvent pas échouer sur un fichier sur 2 Go et peuvent certainement échouer sur un fichier de 16 Go.

Vous devez voir à quel point long int est sur votre plate-forme. Si c'est 64 bits, tu vas bien. Si c'est 32 ans, vous avez probablement des problèmes lors de l'utilisation de fTell pour mesurer la distance entre le début du fichier.

envisagez d'utiliser fgetPOS et fsetpose à la place.


2 commentaires

Le commentaire ".. Vous ne pouvez pas utiliser légalement fseek offsets sans appel à fTell " est vrai pour les fichiers ouverts Mode texte. Les fichiers ouverts en mode binaire peuvent utiliser wek_set et west_cur avec des compensations arbitraires.


@CAF: merci. Ma réponse a été modifiée comme vous l'avez suggéré.



2
votes

Si vous êtes sur un système POSIX-ISH, vous devez vous assurer que vous avez construit votre programme avec un support de compensation de fichier de 64 bits. Les mandats de POSIX (ou au moins le permettent au moins et la plupart des systèmes appliquent ceci) la mise en œuvre pour refuser les opérations IO sur les fichiers dont la taille ne correspond pas à off_t , même si le seul IO étant effectué est séquentiel sans recherche. .

sur Linux, cela signifie que vous devez utiliser -d_file_offset_bits = 64 dans la ligne de commande gcc .


0 commentaires

6
votes

Merci pour la réponse. J'ai compris où j'allais mal. fsek () et fTell () ne fonctionne pas pour les fichiers supérieurs à 4 Go. J'ai utilisé _fseeki64 () et _ftelli64 () et ça marche bien maintenant.


0 commentaires