2012-12-20 2 views
1

Je développe une application Web asp.net qui est censé servir des milliers d'images JPEG aux utilisateurs. Mon serveur dédié contient des fichiers JPEG et héberge un MongoDB pour stocker les métadonnées JPEG.MongoDB C# Pilote pour récupérer 5000 documents itérativement par curseur en utilisant AJAX

Sample object in a collection named **JPEG_123** (this collection has 1 million such documents and each document has _id indexed) 
{ 
    "_id" : "20121210185015000", //YYYYMMDDhhmmsslll 
    "Url" : "http:...", 
    "CameraId" : 123 
} 

J'utilise des méthodes Web pour interroger MongoDB. Je fais une recherche collection JPEG_123 pour le champ Utc avec des expressions régulières (par exemple, «^2012121018 * /) pour obtenir des documents pour une heure. Il retourne environ 5000 dossiers pointés par MongoCursor et MongoShell il ne montre que 3-4 fois milli secondes pour récupérer ces données.

Q. Comment

puis-je obtenir ces documents itérativement de MongoDB la meilleure façon et rapide dans ASP.NET grâce à MongoCursor? Avec une utilisation optimale de LIMIT, BATCHSIZE et NEXT comme attributs de MongoCursor. Je suis en train de faire quelque chose comme ceci:

  • Execute ci-dessus sur la requête Trouver MongoDB de ASP.NET
  • extraient que 500 premiers documents sur le réseau au départ et garder le repos 4500 dans la RAM
  • Fetch 4500 documents de repos dans ce MongoCursor en 9 itérations ultérieures (chaque fois obtenir 500)
  • OU toute autre possibilité d'accélérer ce processus d'envoi de ces données sur le réseau

Mes préoccupations

  1. Lorsque j'interroge MongnoDB à partir d'ASP.NET, cela signifie-t-il vraiment que MongoDB charge tous les 5000 enregistrements en RAM mais ne renvoie pas tous les 5000 enregistrements à ASP.NET?

  2. Après avoir émis la requête ci-dessus, elle retourne instantanément nombre total d'enregistrements pointés par les MongoCursor. Lorsque je parcours tous les documents dans MongoCursor, cela prend environ 20-30 secondes. Cela signifie-t-il que MongoDB renvoie des données lorsqu'il est utilisé dans l'application?

Répondre

0

J'ai trouvé que l'utilisation de curseurs avec de grandes tailles d'ensembles est très lente à moins que la collection soit très bien indexée. Vous devriez noter que, pour la plupart, Regex empêche l'utilisation d'index et vous devriez essayer d'éviter de les utiliser si possible.

Par défaut curseurs retour 101 documents ou 1 Mo de données par lot. Si vous pouvez déterminer la taille de votre document moyen en consultant les statistiques de votre collection, vous pouvez en tirer parti pour définir la meilleure limite. Il existe également des paramètres avec lesquels vous pouvez jouer dans l'objet curseur pour aider à étendre ces limites dans une certaine mesure.

L'une des choses que je pourrais suggérer, car les écritures sont déjà lent par rapport aux lectures, est de passer les chaînes UTC dans les champs comme la date et laissez Mongo ceux pour vous analyser. De cette façon, vous pouvez indexer le champ et utiliser des comparaisons de plages de dates normales dans vos requêtes.

Questions connexes