2010-08-26 22 views
3

J'ai environ 2 millions de chaînes de différentes longueurs que j'ai besoin de compresser et de mettre dans MongoDb GridFS en tant que fichiers.Importation rapide dans MongoDb

Les chaînes sont actuellement stockées dans le champ MS SQL TEXT d'une table. J'ai écrit un exemple d'application pour lire chaque ligne, le compresser et le stocker en tant que fichier GridFS.

Il existe un lecteur et un pool de threads de 50 threads qui stockent les résultats. Ca marche mais c'est très lent (100 enregistrements par seconde en moyenne).

Je me demandais s'il y avait un moyen d'importer plus rapidement dans GridFS? J'utilise MongoDb 1.6 sous Windows avec le pilote MongoCSharp en C# et .NET.

+0

50 fils semble beaucoup. Êtes-vous sûr qu'ils ne causent pas la lenteur (verrouillage excessif, et overhead de commutation de fil)? – driis

Répondre

4

Je pense avoir trouvé le problème dans le pilote MongoDb CSharp en le profilant lors de l'exécution d'une application très simple qui place 1000 chaînes dans 1000 fichiers GridFS.

Il s'avère que 97% du temps est passé à vérifier si un fichier avec le même nom de fichier existe dans la collection. J'ai ajouté un index sur le champ du nom de fichier et il est maintenant très rapide! La question pour moi est si le pilote doit garder le nom de fichier unique et fait une vérification, pourquoi ne pas ajouter un index unique si cela est manquant? Quelle est la raison derrière cela?

+0

C'est bizarre. Les noms de fichiers ne doivent pas nécessairement être uniques dans GridFS, car il y a déjà la clé primaire _id, n'est-ce pas? – Thilo

+0

Je ne suis pas sûr de la spécification GridFS, mais le profilage de l'exemple d'application à l'aide de la bibliothèque MongoDbCSharp montre certainement qu'il vérifie si le fichier Existe * et * déclenche une exception si ce n'est pas le cas. – Khash

+0

khash, pouvez-vous poster du code pour mieux comprendre, pls. – user325558