Question

Ce sera une question délicate mais je vais essayer quand même: notre tâche est d'alimenter Microsoft FAST ESP avec giga-octets de données. Le montant final des données indexées est quelque part dans le quartier de 50-60GB.

FAST a une API .NET mais les composants de base sont écrits en Python (pipelines de traitement des documents d'index). Le défi consiste à communiquer de manière fiable avec le système, tout en alimentant gigaoctets de données pour l'indexation.

Les problèmes qui se posent avec ici sont rapides:

  1. le système est décalée quand il est alimenté trop de données à la fois comme veut réindexer ses données au cours de laquelle le système reste injoignable Pendant des heures. Inacceptable.

  2. il est pas possible de faire la queue et toutes les données en série alimenter un article à la fois car cela prendrait trop de temps (plusieurs jours).

  3. lorsqu'un élément ne peut pas être indexé par FAST, le client doit alimenter le nouveau article. Pour que cela fonctionne, le système est censé appeler un rappel méthode pour informer le client sur l'échec. Cependant, chaque fois que le temps système sur le client de l'alimentation est incapable de réagir à l'expiration parce que ce rappel est jamais appelé. D'où le client meurt de faim. Les données sont dans la file d'attente, mais ne peut pas être transmis à système. le file d'attente effondrements. Les données sont perdues. Vous avez l'idée.

Notes:

  1. l'alimentation d'un élément peut prendre quelques secondes pour un petit point et jusqu'à 5-8 heures pour un seul élément important.
  2. les éléments indexés sont à la fois binaire et à base de texte.
  3. l'objectif est la pleine indexation à prendre 48-72h « seulement », à savoir qu'il doit se produire le week-end.
  4. Les pipelines de traitement des documents de FAST (code Python) ici ont environ 30 étages de chacun. Il y a un total de 27 pipelines à partir de cette écriture.

En résumé:

Le défi majeur consiste à alimenter le système avec des objets, petits et grands, à seulement la bonne vitesse (pas trop vite, car il pourrait réduire ou courir dans les problèmes de mémoire; pas trop lent parce que cela va prendre trop de temps), en même temps, d'une manière parallèle comme des fils en cours d'exécution de façon asynchrone. Dans mon avis, il doit être un algorithme qui décide quand l'alimentation quels éléments et combien à la fois. La programmation parallèle vient à l'esprit.

Il pourrait aussi y avoir plusieurs « files d'attente » où chaque file d'attente (processus) est dédié à certaines dimensions des éléments qui sont chargés dans une file d'attente et ensuite introduits un par un (dans les threads de travail).

Je suis curieux de savoir si quelqu'un a jamais fait quelque chose comme ça, ou comment la façon dont vous allez sur un problème comme celui-ci.

EDIT: Encore une fois, je ne cherche pas à "fix" FAST ESP ou améliorer son intérieur fonctionnement. Le défi consiste à utiliser efficacement!

Était-ce utile?

La solution

On dirait que vous travaillez avec un ensemble de questions plus qu'une question de vitesse C # alimentation spécifique.

Quelques questions à l'avant - est ce 60GB données à consommer chaque week-end ou est-il un remplissage initial du système? Est-ce que les données existent comme des éléments du système de fichiers local pour l'installation ESP ou elseware? Est-ce un seul déploiement ESP interne ou une solution que vous cherchez à répliquer à plusieurs endroits? un seul nœud ou installer plusieurs (ou plutôt ... combien - plafond unique de noeud est 20 docprocs)?

La performance ESP est généralement limité par le nombre de documents à manipuler plus que le nombre de fichiers. En supposant que vos plages de données entre la taille e-mail 35k de données et la taille du système de fichiers 350k données 60GB représente entre 180k et docs 1.8mil docs, ainsi que l'alimentation sur 48 heures, vous devez alimentation entre 3750 et 37500 documents par heure. Pas très élevé cible sur le matériel moderne (si vous avez installé ceci sur une machine virtuelle ... eh bien ... les paris sont ouverts, ce serait mieux sur un ordinateur portable).

Pour l'alimentation, vous avez le choix entre le codage et le contrôle plus rapide avec soit la gestion des lots vous nourris ou en utilisant le cadre de DocumentFeeder dans le api qui fait abstraction beaucoup de la logique de traitement par lots. Si vous allez juste pour 37.5k docs / h je sauverait les frais généraux et juste utiliser DocumentFeeder - bien prendre soin dans ses config params. chargeur de documents vous permettra de traiter votre contenu sur une base de documents au lieu de créer par lots vous-même, il permettra également d'une certaine Retrying automatiquement en fonction de configuration. Objectif général devrait être pour un maximum de contenu 50Mb par lot ou 100 documents, selon la première éventualité. Grands docs doivent être envoyés en lots plus petits ... donc si vous avez un fichier de 50 Mo, il devrait idéalement être envoyé par lui-même, etc. Vous auriez fait perdre le contrôle des lots formés par chargeur de documents ... donc la logique là-bas est un peu un meilleur effort de la part de votre code.

Utilisez les callbacks pour surveiller la façon dont le contenu est ce qui en fait dans le système. Fixer des limites sur le nombre de documents ont été nourris que vous ne recevez pas les callbacks finales pour encore. Cible devrait être pour les lots X à soumettre à un moment donné -ou- Y Mb, pause à chaque coupure. X devrait être d'environ 20 + Nombre de processeurs de documents, Y devrait être dans le domaine de 500-1000Mb. Avec le chargeur de documents, il est juste un passe / échec par doc, avec le système traditionnel, il est plus détaillé. Seulement attendre la « garantie » rappel ... qui vous dit qu'il a été traité et sera indexé ... en attendant qu'il soit consultable est inutile.

Définir des limites sur votre contenu ... en général ESP se décomposera avec des fichiers très volumineux, il y a une limite difficile à 2gb car il est encore 32bit procs, mais quoi que ce soit la réalité sur 50mb ne doit avoir les métadonnées introduits. En outre ... éviter les données du journal d'alimentation, il va écraser les structures internes, tuant perf sinon la moindre erreur. Les choses peuvent se faire dans le pipeline de modifier ce qui est interrogeable pour soulager la douleur de certaines données du journal.

Il faut aussi vous assurer que votre index est configuré de manière à bien, au moins 6 partitions avec un accent sur le maintien de ceux d'ordre inférieur vident de façon équitable. Difficile à entrer dans les détails de celui-là sans savoir plus sur le déploiement. La configuration de pipeline peut avoir un impact important et ... aucun document ne devrait jamais prendre 5-8 heures. Assurez-vous de remplacer toutes les étapes de searchexport ou htmlexport utilisé avec des instances personnalisées avec un délai d'attente de sain d'esprit (30-60 sec) -. Défaut est pas temporisation

Le dernier point ... les chances sont que peu importe la façon dont votre alimentation est configuré, le pipeline d'erreur sur certains documents. Vous devez être prêt à accepter que ce soit ou réalimenter simplement les métadonnées (il y a d'autres options, mais un peu en dehors du champ d'application ici).

bonne chance.

Autres conseils

Tout d'abord, vous devez utiliser les tâches pour ce problème.
Ils peuvent être démarrés synchronisation, async, dans la piscine de fil, etc, et beaucoup plus sur la mémoire moins cher que les modèles avec fil de verrouillage.

Je pense que, les crises Task.ContinueWith parfaitement pour votre problème .

algorithme ressemble à:

  1. Réunissez une file d'attente avec les données que vous devez publier.
  2. Démarrer une tâche (ou tâches, si vous êtes risqué :) qui prend l'objet plus lourd de la file d'attente. (Et l'objet le plus petit de l'autre côté), et commencer à télécharger.
  3. Créer une méthode pour la fin de téléchargement, qui commencera une nouvelle tâche pour nouvel élément de file d'attente.
  4. Vous pouvez utiliser annulation des jetons pour les délais d'attente.
  5. Chaque fois que vous pouvez définir sur ce point l'erreur get système.

Pouvez-vous utiliser simplement BULK INSERT directement sur la base de données? Sinon, je vous suggère de travailler avec le fournisseur du produit tiers afin qu'ensemble, vous pouvez formuler une solution viable.

La base de données que vous il est inutilisable le décrivait . Vous pouvez trouver un arround de travail, mais vous rencontrerez de grands problèmes similaires à l'avenir. ~ 10GB prendre un jour de transfert et absurde au hasard des sons réindexation.

Mon conseil serait de la demande soit votre fournisseur obtenir la base de données dans un état utilisable (corriger les bugs) ou qu'ils vous donnent un extrait de données et vous faire votre propre databse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top