J'ai écrit un prog C++ pour interroger un dictionnaire de 100 Go. J'ai divisé le dictionnaire en n nombre de fichiers de taille égale. Tous les fichiers split sont placés dans le même répertoire. Le dictionnaire est entièrement indexé, c'est-à-dire qu'une fois qu'une requête arrive, je sais quel fichier spit ouvrir et où chercher. Ma question est pour de meilleures performances, quelle fraction sera meilleure: (a) petit nombre de gros fichiers ou (b) grand nombre de petits fichiers? En outre, ce qui serait une répartition idéale?C++: plus de petits fichiers ou moins de gros fichiers?
Répondre
Je ne pense pas qu'il y ait une réponse directe à cette question. seul l'expérimentation peut vous le dire. Le coût d'ouverture d'un fichier en lecture doit être constant quelle que soit la taille, lire le contenu du fichier dépend bien entendu de la taille du fichier.
Il y a d'autres indices si Je suppose que lorsque vous obtenez une requête, vous ouvrez le fichier, l'analyser/lire complètement ou jusqu'à ce que vous trouviez le mot puis fermez le fichier et renvoyez le résultat, dans ce cas il y a de nombreuses améliorations à faire, peut-être vous avez, peut-être pas, mais ici va
- Si vous obtenez beaucoup de requêtes, ouverture de fichiers peut être coûteux, dans ce cas, vous pourriez avoir besoin de mettre en cache vos fichiers ou votre recherche requêtes pour meilleure performance
- Lorsque vous ouvrez un fichier et le lisez, vous le faites de façon séquentielle, ce qui signifie Plus ou moins le fichier est en cours de chargement dans la mémoire, je suis venu une fois à travers un analyseur syntaxique XML pour Java, qui est capable de charger seulement les morceaux désirés de xml en mémoire, pour manipuler des fichiers xml vraiment énormes, C++. SAX project
check when is a file loaded into memory
Une approche totalement différente serait d'utiliser une base de données avec l'index. ce problème vous n'avez pas à faire face à des problèmes d'ouverture de fichier
Merci. "Le coût d'ouverture d'un fichier pour la lecture devrait être constant quelle que soit la taille" était utile - cela signifie que la taille de la division ne devrait pas avoir d'importance. Je vais vérifier expérimentalement si.Le code ne lit pas un fichier séquentiellement; il fait une opération de recherche comme on sait où exactement dans le fichier l'information liée à un terme de requête est présente. –
Oui, mais en fonction du système d'exploitation et de la fonction utilisée pour l'ouverture, le moment auquel le fichier sera chargé dans la mémoire est différent. –
Le coût d'ouverture d'un fichier en lecture doit être indépendant de la taille du fichier, mais il ne sera pas indépendant du contenu du répertoire de chaque répertoire du chemin du fichier (en commençant par root). Bien sûr, la différence est négligeable pour les annuaires raisonnables. C'est-à-dire que vous ne devriez pas voir de différence lors de l'ouverture d'un fichier dans un répertoire contenant 10 fichiers et dans un répertoire contenant 100 fichiers. Mais dans un répertoire avec un million de fichiers, les choses vont se ralentir. –
Votre dictionnaire est-il statique ou peut-il être modifié lors de l'exécution?
S'il est statique, utilisez un seul fichier pour tout.
Si c'est dynamique et que vos index sont des "vecteurs" (ce n'est pas la meilleure idée), utilisez un fichier pour les données et un fichier pour chaque index. Si elle est dynamique et que vos index sont des "arbres" (y compris des deques et d'autres vecteurs comme les ADT qui ne sont pas contigus à 100%), vous pouvez réutiliser un seul fichier, à moins que cela ne soit logique. volumes.
Vous devez ouvrir le fichier au début et ne plus encourir de pénalité d'ouverture/fermeture de fichier.
Si votre application est en 64 bits, il suffit de mapper l'ensemble du fichier en mémoire et de laisser le système d'exploitation faire le reste.
Si votre application est de 32 bits, utilisez toujours le mappage de mémoire pour accéder au fichier. Vous aurez besoin de créer une "fenêtre" mappée en mémoire pour chaque accès concurrent possible que vous pourriez avoir besoin de faire (pour les données statiques, probablement une par thread sur les données, une ou deux par thread sur chaque index).
- 1. Partage de gros fichiers dans Stata en fichiers plus petits
- 2. Inclure un gros fichier ou plusieurs fichiers plus petits?
- 3. Cassandra - nombreux petits ou moins gros nœuds?
- 4. PHP: Un gros fichier ou plusieurs petits fichiers
- 5. XQuery: Comment diviser de gros fichiers XML en plus petits
- 6. Bash diviser un gros fichier en fichiers plus petits
- 7. diviser gros fichier en petits fichiers
- 8. Partage de gros fichiers
- 9. Diviser un gros fichier en fichiers plus petits par le nombre de lignes en C#?
- 10. Déplacement avec l'écrasement de fichiers plus petits
- 11. Comment diviser routes.rb en fichiers plus petits
- 12. HDFS petits fichiers
- 13. Extraction de gros fichiers Wav en plus petits morceaux en Java
- 14. erreur de mémoire lors de la division de gros fichiers en petits fichiers en python
- 15. Comparaison de gros fichiers en C++
- 16. Écriture de gros fichiers en C++
- 17. Je n'arrive pas à télécharger de petits fichiers mais je peux télécharger de gros fichiers
- 18. lecture/écriture de gros fichiers VB.NET
- 19. Convertir par grand nombre de fichiers plus petits en un petit nombre de gros fichiers dans Windows
- 20. C# Sockets, recevoir de gros fichiers
- 21. dans unix, est-il préférable de trier plusieurs petits fichiers, ou un gros fichier?
- 22. Computing MD5SUM de gros fichiers en C#
- 23. Télécharger de gros fichiers
- 24. Enregistrement de gros fichiers
- 25. Plus rapide pour les gros fichiers: pdflib ou princexml?
- 26. Collage de gros fichiers
- 27. Lecture de gros fichiers séquentiellement
- 28. fractionnement du fichier sqlite en fichiers plus petits
- 29. Fusion de gros fichiers en C#
- 30. Comment séparer app.module en fichiers plus petits?
Idéalement, vous utiliseriez des tables indexées dans une base de données correctement implémentée. Regardez SQLite par exemple, qui peut être intégré dans votre propre code C++. – littleadv