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? P>
6 Réponses :
Le Vous pouvez avoir la fonction fTell () code> La fonction renvoie généralement un
non signé long code>, qui monte seulement 2 32 sup> 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 code>. P>
ftell64 () code> la fonction disponible ou la fonction
fgetPOS () code> peut renvoyer un décalage plus important pour vous. P>
Je n'ai pas de ftell64 () et FgetPos () renvoie la même chose que ftell ()
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. p>
Ne faites pas peur aux gens, ce sont des fonctions C et une partie de l'API Windows :)
Sauf si vous pouvez utiliser une méthode 64 bits comme suggérée par LoadMaster, je pense que vous devrez briser le fichier. p>
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.
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. P>
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 (). P>
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. P>
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. P>
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. P>
Edit: Oh, j'ai appris ici que lire () et que les amis sont absorbés. Quelle est la différence entre Lecture () et Fread ()? A > p>
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 b>. 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 i>. 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?