2012-09-20 1 views
1

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?

+3

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

Répondre

0

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

  1. 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
  2. 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

+0

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. –

+0

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. –

+0

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. –

1

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).

Questions connexes