9
votes

Faire des opérations de fichier avec des adresses de 64 bits en C + Mingw32

J'essaie de lire dans un fichier XML de 24 Go en C, mais cela ne fonctionnera pas. J'imprime la position actuelle à l'aide de FTELL () comme je l'ai lu, mais une fois que cela atteint un nombre suffisant, cela remonte à un petit nombre et commence à ne jamais obtenir 20% de 20% dans le fichier. Je suppose que ceci est un problème de la plage de la variable utilisée pour stocker la position (longue), qui peut aller jusqu'à 4 000 000 000 en fonction de http://msdn.microsoft.com/en-us/library/s3f49ktz (vs.80) .aspx , tandis que mon fichier mesure 25 000 000 000 octets de taille. Une longue longue portée devrait fonctionner, mais comment changerais-je quel compilateur ( Cygwin / MINGW32 ) utilise ou obtenez-la d'avoir FOPEN64?


17 commentaires

WOW, un fichier XML de 24 Go.


Sa wikipedia (le tout)


Je n'ai pas beaucoup d'internet de l'époque, et je pense que Wikipedia serait utile, alors je l'ai téléchargée et je tente maintenant de la compresser et de faire un lecteur pour cela.


En fait, vous échouez-vous à lire le fichier dans ou omettez simplement de trouver la taille du fichier?


Omettre de le lire. Je passe dans le fichier, trouvant tous les titres de la première étape et les stocker avec leur position, puis mal réussir et compresser les articles dans des morceaux, indexant dans un fichier principal, mais il ne passe jamais à travers la fichier, puisque la position enveloppe et je commence à lire le début


Hors sujet, mais je suis un peu surpris que toute Wikipedia ne soit que 24gigs (y compris XML au-dessus)


Moi aussi, mais cela semble vraiment assez proche ... 24 milliards de lettres ... (son seul anglais) ... il semble certain que tout a tout (juste à partir de la navigation sur les titres mon programme imprime. De plus, regardez un coup d'œil à Encyclopédie pour iPod (où j'ai eu l'idée), ils correspondent à l'ensemble de 1-2 Go et l'affiche sur un iPod


Si vous avez lu avec succès ce fichier, vous pourriez dire "je lisais tout le Wikipedia"


En supposant que ce soit juste du texte, je suis surpris que c'est que grand . Une encyclopédie standard (Hard-Copy) a sur environ 4 Ko de texte par page (~ 90 colonnes, 50 rangées). Dites 700 pages par alphabétique * 26 volumes, 73mb / World Book. Arrondi jusqu'à 100 Mo. Wikipedia est donc de 240 livres mondiaux.


Avez-vous vu ceci: arstechnica.com/gadgets/news/2009/10/...


Je sais que votre question de programmation est bonne et valable, mais il n'y a-t-il pas quelques outils existants hors ligne Wikipedia? J'ai vu cela mais je ne sais pas si cela vous intéresse (peut-être que vous voulez juste que vous vous moquiez de le faire vous-même): blog.fupps.com/2008/05/20/...


@MOCJ: J'allais juste suggérer cela. J'ai l'un des téléphones OpenMoko FreeRunner. Dispositif cool, bien que clairement une bêta. IIRC, le nouveau Wiki Reader Thingy compte 3 millions d'articles et il faut 4 Go.


@Michael Patrotta Wikipedia est énorme . en.wikipedia.org/wiki/...


@Tim: Cela ressemble à environ 63 livres mondiaux. Cela aurait peut-être pu chercher à cracher la distance de mon estimation dans les deux années que depuis.


c'est environ 6,3 millions d'articles


Ne serait-il pas plus facile d'utiliser Wget ou quelque chose de similaire pour simplement télécharger chaque page, etc., en tant que fichier individuel? Les systèmes de fichiers sont très bons pour traiter des choses comme ceci :)


Je ne suis pas un programmeur C, mais je ne pourrais-tu pas utiliser de fichier mappé en mémoire?


6 Réponses :


3
votes

Le fTell () La fonction renvoie généralement un non signé long , qui monte seulement 2 32 octets (4 Go) sur 32- Systèmes de bits. Donc, vous ne pouvez pas obtenir le décalage de fichier pour un fichier de 24 Go pour s'adapter à un 32 bits long .

Vous pouvez avoir la fonction ftell64 () la fonction disponible ou la fonction fgetPOS () peut renvoyer un décalage plus important pour vous.


1 commentaires

Je n'ai pas de ftell64 () et FgetPos () renvoie la même chose que ftell ()



3
votes

Vous pouvez essayer d'utiliser les fonctions de fichier fournies par le système d'exploitation Createfile et Listerfile . Selon le Pointeurs de fichier sujet, la position est stocké comme une valeur de 64 bits.


1 commentaires

Ne faites pas peur aux gens, ce sont des fonctions C et une partie de l'API Windows :)



0
votes

Sauf si vous pouvez utiliser une méthode 64 bits comme suggérée par LoadMaster, je pense que vous devrez briser le fichier.

Cette ressource semble suggérer qu'il est possible d'utiliser _Telli64 (). Je ne peux pas tester cela, car je n'utilise pas Mingw.


1 commentaires

Mais il n'y a pas d'option de compilateur ni quoi que ce soit pour leur permettre? Je peux les voir dans les fichiers inclus, mais ils sont sous un #Ifdef.



0
votes

Je ne sais aucun moyen de le faire dans un seul fichier, un peu de hack, mais si vous divisez correctement le fichier n'est pas une option réelle, vous pouvez écrire quelques fonctions que TEMP divisait le fichier, un qui utilise FTELL () pour passer à travers le fichier et swaps FTELL () dans un nouveau fichier lorsque cela atteignait le point fractionné, un autre qui suit les fichiers de retour avant de quitter. Une approche absolument bâclée, mais si aucune meilleure solution ne vient à la lumière, cela pourrait être un moyen de faire le travail.


0 commentaires

-1
votes

Même si le FTELL () dans la bibliothèque Microsoft C renvoie une valeur 32 bits et renvoie donc évidemment des valeurs de faussetés une fois que vous avez atteint 2 Go, la lecture du fichier doit toujours fonctionner correctement. Ou avez-vous besoin de chercher dans le fichier aussi? Pour cela, vous avez besoin de _ftelli64 () et _fseeki64 ().

Notez que Contrairement à certains systèmes UNIX, vous n'avez besoin d'aucun drapeau spécial lors de l'ouverture du fichier pour indiquer qu'il s'agit d'un "mode 64 bits". L'API Win32 sous-jacente gère de gros fichiers.


0 commentaires

0
votes

J'ai trouvé la réponse. Au lieu d'utiliser Fopen, Fsek, Fread, Fewrite ... J'utilise _open, lseaki64, lisez, écrivez. Et je suis capable d'écrire et de rechercher des fichiers de 4 Go.

Edit: Il semble que ces dernières fonctions soient environ 6 fois plus lentes que les anciennes. Je vais donner à la Bounty quiconque qui peut expliquer cela.

Edit: Oh, j'ai appris ici que lire () et que les amis sont absorbés. Quelle est la différence entre Lecture () et Fread ()?


0 commentaires