4

De temps en temps, je reçois un gros fichier de données que mon client télécharge et qui doit être traité par CMFL. Le problème est que si je mets le traitement sur une page CF, alors il se heurte à un problème de délai d'attente après 120 secondes. J'ai été en mesure de déplacer le code de traitement vers un CFC où il semble ne pas avoir le problème de timeout. Toutefois, au cours du traitement, ColdFusion se bloque et doit redémarrer. Il y a un certain nombre de requêtes de base de données (5 ou plus, mélange de mises à jour et de sélections) requises pour chaque ligne (8 000+) du fichier que je traverse ainsi que d'autres logiques fournies par moi sous forme de CFML.Comment accélérer le travail de traitement par lots dans Coldfusion?

Ma question est quelle serait la meilleure façon de parcourir ce fichier. Une mise en garde, je ne suis pas en mesure de déplacer le fichier sur le serveur de base de données et de le traiter entièrement avec la base de données. Cependant, serait-il plus efficace de passer chaque ligne à une procédure stockée qui prend soin de tout? Ce serait encore beaucoup d'appels à la base de données, mais rien comparé à ce que j'ai maintenant. En outre, quelle serait la meilleure façon de fournir des commentaires à l'utilisateur sur la quantité de fichier a été traitée?

Edit: Je suis en cours d'exécution CF 6.1

+1

Je crois qu'il existe un paramètre de requête que vous pouvez définir pour augmenter le délai jusqu'à la valeur de votre choix. – teabot

+1

Avez-vous essayé ? – Alex

+0

Je suis à peu près sûr qu'il existe aussi une commande qui vous permet d'exécuter une page CF à partir de la ligne de commande, mais que vous ne l'avez pas utilisée depuis longtemps. – teabot

Répondre

0

SQL Server Integration Services (SSIS) est l'outil recommandé pour ETL complexe (extraction, transformation et chargement) de travail, ce qui est ce que cela ressemble. (Il peut être configuré pour accéder aux fichiers sur d'autres serveurs.) La question pourrait être, pouvez-vous travailler sur une interface entre Cold Fusion et SSIS?

6

Je viens de faire une chose similaire et d'utiliser CF souvent pour l'analyse des données.

1) Conserver une table de téléchargement de fichier (table parent). Pour chaque fichier téléchargé, vous devriez pouvoir conserver une liste de chaque fichier et son statut (chargé, traité, non traité)

2) Table temporaire pour stocker toutes les lignes du fichier de données. (table enfant) Importez le fichier de données entier dans une table temporaire. Tenter de tout faire en mémoire conduira inévitablement à quelques erreurs. Chaque ligne de cette table sera liée à une entrée de table de téléchargement de fichiers ci-dessus.

3) Conserver un statut de traitement - Pour chaque ligne du fichier de données que vous introduisez, définissez une variable "process/unprocessed". De cette façon, si elle casse, vous pouvez commencer à partir de l'endroit où vous vous étiez arrêté. Lorsque vous parcourez chaque ligne, définissez-la pour qu'elle soit "traitée".

4) Transaction - utilisez cftransaction si possible pour valider tout cela en même temps, ou au moins une ligne à la fois (avec vos 5 requêtes). De cette façon, si quelque chose bouge, vous n'avez pas une ligne de données qui est à moitié calculée/traitée/mise à jour/testée.

5) Une fois que vous avez terminé le traitement, définissez l'entrée de nom de fichier dans la table à l'étape 1 à « traiter »

En utilisant l'approche ci-dessus, en cas d'échec quelque chose, vous pouvez le configurer pour commencer où il s'est arrêté, ou du moins, il a indiqué clairement où commencer l'enquête ou, dans le pire des cas, nettoyer vos données. Vous aurez une manière claire d'afficher à l'utilisateur l'état du traitement de téléchargement en cours, où il se trouve et où il s'est arrêté s'il y avait une erreur.

Si vous avez des questions, faites le moi savoir.

Autres pensées:

  1. Vous pouvez augmenter les délais d'attente, donner la machine virtuelle plus de mémoire, mettez-le en 64 bits, mais tous ceux qui n'augmenterons la capacité de votre système tant. C'est une bonne idée de faire ces par appel et de le faire en conjonction avec ce qui précède. Java a quelques bibliothèques de traitement de fichiers soignées qui sont disponibles en tant que CFCS. Si vous rencontrez beaucoup de problèmes de vitesse, vous pouvez en utiliser un pour le lire dans une variable puis dans la base de données

  2. Si vous utilisez XML, n'utilisez pas l'analyse xml de coldfusion. Il fonctionne bien pour les fichiers plus petits et a des ajustements quand les choses grossissent. Il y a plusieurs cfc écrits ici (vérifiez riaforge, etc) qui enveloppent d'excellentes bibliothèques java pour analyser les données xml. Vous pouvez ensuite créer une cfquery manuellement si besoin est avec ces données.

+0

Merci d'expliquer votre méthode, il m'a donné quelques conseils pour exécuter des ensembles de données massives dans CF. – JasonBartholme

+0

Heureux qu'il était utile. Je suis sûr que ce n'est pas complet et au moins une liste formée d'apprendre quoi ne pas faire et arriver à ceux-ci. Bonne chance :) –

4

Il est difficile de dire sans plus d'informations, mais d'après ce que vous avez dit, je tire trois idées. La première chose, est qu'avec tant d'opérations de base de données, il est possible que vous génériez trop de débogage. Assurez-vous que sous Paramètres de sortie de débogage dans l'administrateur que les paramètres suivants sont désactivés.

  • activer la fonction Informations d'exception robuste
  • Activer AJAX journal de débogage fenêtre
  • Demande Debugging sortie

La deuxième chose que je voudrais faire est de regarder ces requêtes DB et assurez-vous qu'ils sont optimisés. Assurez-vous que les sélections sont en cours avec des indices, etc.

La troisième chose que je soupçonne est que le fichier qui traîne en mémoire est probablement sous-optimal.

Je voudrais essayer une boucle dans le fichier en utilisant looping fichier:

<cfloop file="#VARIABLES.filePath#" index="VARIABLES.line"> 
    <!--- Code to go here ---> 
</cfloop> 
+1

On dirait que vous vouliez peut-être un échantillon de code pour être là à la fin? Si oui, c'est manquant. –

0

Si vous pouvez passer à cf8 et profiter du fichier cfloop = « » qui vous donnera une plus grande vitesse et le fichier ne serait pas mis en mémoire (qui est probablement la cause de l'écrasement). Selon la situation que vous rencontrez, vous pouvez également utiliser cfthread pour accélérer le traitement.

+0

Malheureusement, passer à CF8 n'est pas une option pour le moment. – Jason

+0

Est-il possible d'installer l'édition du développeur sur votre ordinateur local et de vous connecter à la base de données. De cette façon, vous pouvez profiter des fonctionnalités de CF8. Je l'ai fait par le passé, mais vous ne pouvez peut-être pas dans votre situation. – JasonBartholme

1

Avez-vous essayé une passerelle d'événements? Je crois que ces threads ne sont pas soumis aux mêmes paramètres de délai d'attente que les threads de demande de page.

+0

êtes-vous sûr de cela? Je pensais que c'était la même chose ... – Henry

0

Actuellement, une passerelle d'événements est le seul moyen de contourner les limites de délai d'un cycle de requête HTTP. CF a et non a un moyen de traiter les pages CF hors ligne, c'est-à-dire qu'il n'y a pas d'invocation de ligne de commande (l'un de mes plus gros reproches à propos de CF - très peu de traitement). Votre meilleur choix est d'utiliser une passerelle d'événements ou de réécrire votre logique d'analyse en Java direct.

0

je devais faire la même chose, Ben Nadel a écrit un tas de grands articles utilise le fichier java io, pour vous permettre de lire plus rapidement les fichiers, écrire des fichiers etc ...

vraiment aidé à améliorer les performances de notre application d'importation csv.

Questions connexes