Suite

Accélérer les outils de script Python pour obtenir des propriétés raster à l'aide d'ArcPy ?


J'utilise des outils de script python pour ArcGIS 10.2, sous Windows 8.1 64 bits.

Lorsque j'utilise la commande arcpy.GetRasterProperties_management(), le traitement des données est très lent.

Par exemple. J'ai essayé d'obtenir la valeur maximale pour 14 rasters, si j'utilise le mode batch de l'outil système : Get Raster Properties, il n'utilise que 0,19 seconde.

Mais lorsque j'utilise des outils de script python pour ce faire, il faut essentiellement 1 seconde pour imprimer 1 valeur à l'écran. Il faut donc 15 secondes pour obtenir la valeur maximale des 14 rasters. Ainsi, lorsque j'ai des centaines de rasters à traiter, cela prend trop de temps.

Et c'est lorsque l'utilisation du processeur est de 20%, ce qui est l'utilisation maximale lors de l'exécution d'ArcGIS sur mon ordinateur portable, parfois le processeur ne pouvait même pas y arriver, lorsque l'utilisation n'est que de 5 ou 6%, il faut une minute pour tout obtenir les valeurs.

voici le code que j'utilise pour cette partie :

pour out_raster dans out_rasters : essayez : raster_min = arcpy.GetRasterProperties_management(out_raster,"MINIMUM") raster_min = raster_min.getOutput(0) arcpy.AddMessage(raster_min) sauf : arcpy.AddMessage("No_data")

Y a-t-il un moyen d'augmenter la vitesse ?


Tu demandes, 'donc y a-t-il un moyen d'augmenter la vitesse?'

Appels de géotraitement commearcpy.GetRasterProperties_management()sont des appels lents. En utilisant learcpyobjets, dans ce casRasteret accéder à sa propriétéle minimumsera généralement (très probablement toujours) plus rapide.

Plus précisément, une façon d'accélérer votre script serait d'utiliser :

raster_minimum = arcpy.Raster(chemin).minimum

pour obtenir la valeur minimale. Test rapide sur ma machine en boucle sur des chemins raster et en utilisant votre méthode :

arcpy.GetRasterProperties_management('[raster_path]',"MINIMUM")' raster_min = raster_min.getOutput(0)

a pris deux fois plus de temps pour terminer chaque appel que leRasterméthode objet.


Vous pouvez essayer de supprimer ArcPy en le convertissant en tableau, puis en utilisant la fonction minimum de numpy.


Orion, je viens de remarquer que vous avez mentionné dans votre réponse à msi_g que même après avoir installé le géotraitement en arrière-plan 64 bits, votre outil fonctionne toujours au premier plan.

Par défaut, tous les modèles et outils de script s'exécutent au premier plan, ce qui signifie qu'ils s'exécutent tous par défaut dans un environnement 32 bits.

Avez-vous décoché la case "Toujours exécuter au premier plan" dans l'onglet Propriétés générales de votre outil de script ?

Sinon, dans la fenêtre Catalogue ou ArcToolbox, cliquez avec le bouton droit sur votre outil et cliquez sur Propriétés. Dans l'onglet Général, décochez Toujours exécuter au premier plan et cliquez sur OK.

Ensuite, assurez-vous que le géotraitement en arrière-plan est réellement activé. Dans le menu ArcMap, cliquez sur Géotraitement > Options de géotraitement. Dans le volet Traitement en arrière-plan, cochez Activer.


Définition de la taille de cellule par défaut

J'ai des problèmes en essayant de définir une taille de cellule par défaut pour la conversion de polygone en raster. J'ai besoin de convertir un flux mis en mémoire tampon (polygone) en une couche raster, afin que je puisse graver le flux dans un DEM. J'aimerais automatiser ce processus pour l'inclure dans un script plus volumineux.

Mon principal problème est que l'outil PolygonToRaster_conversion() ne me permet pas de définir la taille de la cellule sur une valeur de couche raster. Il n'obéit pas non plus à la taille de cellule raster par défaut que j'essaie de définir dans l'environnement. Au lieu de cela, il utilise systématiquement la "étendue divisée par 250" par défaut.

Voici mon script pour ce processus:

Cela produit l'erreur suivante : « La taille de la cellule doit être supérieure à zéro.

La même erreur se produit si je tape le chemin de la couche DEM.

J'ai également essayé de saisir manuellement un nombre pour la taille de la cellule. Cela fonctionne, mais je veux généraliser la convivialité de cet outil.

Ce que je ne comprends vraiment pas, c'est que j'ai utilisé la couche DEM comme taille de cellule manuellement via l'interface ArcGIS et cela a parfaitement fonctionné !!


GWR est un modèle de régression locale. Les coefficients peuvent varier.

GWR construit une équation distincte pour chaque caractéristique de l'ensemble de données incorporant les variables dépendantes et explicatives des caractéristiques dans la bande passante de chaque caractéristique cible. La forme et l'étendue de la bande passante dépendent de l'entrée de l'utilisateur pour les paramètres Type de noyau , Méthode de bande passante , Distance et Nombre de voisins avec une restriction : lorsque le nombre d'entités voisines dépassera 1000, seuls les 1000 les plus proches sont incorporés dans chaque local équation.

La GWR doit être appliquée à des ensembles de données avec plusieurs centaines de caractéristiques pour de meilleurs résultats. Ce n'est pas une méthode appropriée pour les petits ensembles de données. L'outil ne fonctionne pas avec des données multipoints.

L'outil GWR produit une variété de sorties. Un résumé du modèle GWR est disponible sous forme de messages au bas du volet Géotraitement pendant l'exécution de l'outil. Vous pouvez accéder aux messages en survolant la barre de progression, en cliquant sur le bouton contextuel ou en développant la section des messages dans le volet Géotraitement. Vous pouvez également accéder aux messages d'un outil de régression pondérée géographiquement exécuté précédemment via l'historique de géotraitement.

Le fichier _supp est toujours créé au même emplacement que la classe d'entités en sortie, sauf si la classe d'entités en sortie est créée dans un jeu de classes d'entités. Lorsque la classe d'entités en sortie se trouve dans un jeu de classes d'entités, la table _supp est créée dans la géodatabase contenant le jeu de classes d'entités.

Il est recommandé d'utiliser des données projetées. Ceci est particulièrement important lorsque la distance est un composant de l'analyse, comme c'est le cas pour GWR lorsque vous sélectionnez Fixe pour le type de noyau . Il est recommandé de projeter vos données à l'aide d'un système de coordonnées projetées (plutôt qu'un système de coordonnées géographiques).

Certains des calculs de l'outil GWR tirent parti de plusieurs processeurs pour augmenter les performances et utiliseront automatiquement jusqu'à huit threads/processeurs pour le traitement.

Vous devez toujours commencer l'analyse de régression par la régression des moindres carrés ordinaires (OLS). Trouvez d'abord un modèle OLS correctement spécifié. Utilisez ensuite les mêmes variables explicatives pour exécuter GWR (à l'exclusion de toute variable explicative factice représentant différents régimes spatiaux).

Les variables dépendantes et explicatives doivent être des champs numériques contenant une variété de valeurs. Les méthodes de régression linéaire, telles que GWR, ne sont pas appropriées pour prédire des résultats binaires (par exemple, toutes les valeurs de la variable dépendante sont soit 1 soit 0).

Dans les modèles de régression globale, tels que la régression des moindres carrés ordinaires (OLS), les résultats ne sont pas fiables lorsque deux variables ou plus présentent une multicolinéarité (lorsque deux variables ou plus sont redondantes ou racontent ensemble la même histoire). GWR crée une équation de régression locale pour chaque caractéristique du jeu de données. Lorsque les valeurs d'une variable explicative particulière se regroupent spatialement, il est probable qu'il y ait des problèmes de multicolinéarité locale. Le champ de numéro de condition ( COND ) dans la classe d'entités en sortie indique quand les résultats sont instables en raison de la multicolinéarité locale. En général, soyez sceptique quant aux résultats des entités avec un numéro de condition supérieur à 30, égal à Null ou, pour les fichiers de formes, égal à -1.7976931348623158e+308.

Soyez prudent lorsque vous incluez des données nominales ou catégorielles dans un modèle GWR. Lorsque les catégories se regroupent spatialement, il existe un risque de rencontrer des problèmes de multicolinéarité locale. Le numéro de condition inclus dans la sortie GWR indique quand la colinéarité locale est un problème (un numéro de condition inférieur à zéro, supérieur à 30 ou défini sur Null). Les résultats en présence de multicolinéarité locale sont instables.

N'utilisez pas de variables explicatives artificielles pour représenter différents régimes spatiaux dans un modèle GWR (par exemple, les secteurs de recensement en dehors du noyau urbain reçoivent une valeur de 1, tandis que tous les autres reçoivent une valeur de 0). Étant donné que le GWR permet aux coefficients des variables explicatives de varier, ces variables explicatives du régime spatial sont inutiles et, si elles sont incluses, créeront des problèmes de multicolinéarité locale.

Pour mieux comprendre la variation régionale parmi les coefficients de vos variables explicatives, examinez les surfaces de coefficients raster facultatives créées par GWR. Ces surfaces raster sont créées dans l'espace de travail raster Coefficient. Pour les données surfaciques, vous pouvez utiliser une couleur graduée ou un rendu froid à chaud sur chaque champ de coefficient dans la classe d'entités en sortie pour examiner les changements dans votre zone d'étude.

Vous pouvez utiliser GWR pour la prédiction en fournissant une classe d'entités d'emplacements de prédictions (souvent cette classe d'entités est la même que la classe d'entités en entrée ), les variables explicatives de prédiction et une classe d'entités de prédiction en sortie . Il doit y avoir une correspondance biunivoque entre les champs utilisés pour calibrer le modèle de régression (les valeurs saisies pour le champ Variables explicatives) et les champs utilisés pour la prédiction (les valeurs saisies pour le champ Variables explicatives de prédiction). L'ordre de ces variables doit être le même. Supposons, par exemple, que vous modélisiez des accidents de la circulation en fonction des limites de vitesse, des conditions routières, du nombre de voies et du nombre de voitures. Vous pouvez prédire l'impact que la modification des limites de vitesse ou l'amélioration des routes pourraient avoir sur les accidents de la circulation en créant de nouvelles variables avec les limites de vitesse et les conditions routières modifiées. Les variables existantes seraient utilisées pour calibrer le modèle de régression et seraient utilisées pour le paramètre Variables explicatives. Les variables modifiées seraient utilisées pour les prédictions et seraient entrées en tant que variables explicatives de prédiction .

Si une classe d'entités d'emplacements de prédiction est fournie mais qu'aucune variable explicative de prédiction n'est spécifiée, la classe d'entités de prédiction en sortie est créée avec des coefficients calculés pour chaque emplacement uniquement (aucune prédiction).

Un modèle de régression est spécifié de manière incorrecte s'il manque une variable explicative clé. Une autocorrélation spatiale statistiquement significative des résidus de régression ou une variation spatiale inattendue parmi les coefficients d'une ou plusieurs variables explicatives suggère que votre modèle est mal spécifié. Vous devez vous efforcer (par le biais de l'analyse résiduelle OLS et de l'analyse de variation du coefficient GWR, par exemple) de découvrir quelles sont ces variables manquantes clés afin qu'elles puissent être incluses dans le modèle.

Toujours se demander s'il est logique qu'une variable explicative soit non stationnaire. Par exemple, supposons que vous modélisiez la densité d'une espèce végétale particulière en fonction de plusieurs variables, dont ASPECT. Si vous constatez que le coefficient de la variable ASPECT change dans la zone d'étude, vous voyez probablement des preuves d'une variable explicative manquante (peut-être la prévalence de la végétation concurrente, par exemple). Vous devez vous efforcer d'inclure toutes les variables explicatives clés dans votre modèle de régression.

Avertir:

Lorsque vous utilisez des fichiers de formes, gardez à l'esprit qu'ils ne peuvent pas stocker de valeurs nulles. Les outils ou autres procédures qui créent des fichiers de formes à partir d'entrées autres que des fichiers de formes peuvent, par conséquent, stocker des valeurs nulles sous forme de zéro ou d'un très petit nombre négatif (-DBL_MAX = -1.7976931348623158e+308). Cela peut conduire à des résultats inattendus. Pour plus d'informations, consultez Considérations relatives au géotraitement pour la sortie de fichiers de formes.

Lorsque le résultat d'un calcul est infini ou indéfini, le résultat pour les fichiers sans forme sera Null pour les fichiers de formes, le résultat sera -DBL_MAX = -1.7976931348623158e+308.

Lorsque vous sélectionnez Akaike Information Criterion ou Cross Validation pour le paramètre Bandwidth Method, GWR trouvera la distance optimale (pour un noyau fixe) ou le nombre optimal de voisins (pour un noyau adaptatif). Cependant, les problèmes de multicolinéarité locale empêcheront les méthodes de bande passante du critère d'information d'Akaike et de la validation croisée de résoudre une distance/un nombre de voisins optimaux. Si une erreur se produit indiquant de graves problèmes de conception de modèle, essayez de spécifier une distance particulière ou un nombre de voisins. Examinez ensuite les numéros de condition dans la classe d'entités en sortie pour voir quelles entités sont associées à des problèmes de colinéarité locale

De graves erreurs de conception de modèle, ou des erreurs indiquant que les équations locales n'incluent pas suffisamment de voisins, indiquent souvent un problème de multicolinéarité globale ou locale. Pour déterminer où se situe le problème, exécutez votre modèle à l'aide d'OLS et examinez la valeur VIF pour chaque variable explicative. Si certaines des valeurs VIF sont élevées (au-dessus de 7,5, par exemple), la multicolinéarité globale empêche la résolution de GWR. Plus probablement, cependant, la multicolinéarité locale est le problème. Essayez de créer une carte thématique pour chaque variable explicative. Si la carte révèle un regroupement spatial de valeurs identiques, envisagez de supprimer ces variables du modèle ou de combiner ces variables avec d'autres variables explicatives pour augmenter la variation des valeurs. Si, par exemple, vous modélisez les valeurs d'une maison et avez des variables pour les chambres et les salles de bains, vous souhaiterez peut-être les combiner pour augmenter la variation des valeurs ou pour les représenter en pieds carrés de salle de bain/chambre. Évitez d'utiliser des variables fictives de régime spatial, de regrouper spatialement des variables catégorielles ou nominales, ou des variables avec très peu de valeurs possibles lors de la construction de modèles GWR.

GWR est un modèle linéaire soumis aux mêmes exigences que l'OLS. Consultez la section Comment les modèles de régression vont mal dans Bases de l'analyse de régression pour vous assurer que votre modèle GWR est correctement spécifié.


Accélérer les processus raster ?

J'essaie de "mosaïquer vers un nouveau raster" de gros rasters et je me demande ce que je peux faire pour accélérer les choses.

Pour commencer, je travaille sur un système Win 7-64bit avec 16 Go de RAM et i7-4770 @ 3,40 GHz. Les rasters ont une résolution de 1 mètre, 1 bande, flottant de 32 bits, et le plus grand a plus de 100 000 lignes et 200 000 colonnes (environ 75 Go).

Cette fois, cela fait environ 6 heures que cela mosaïste et je n'ai aucune idée du temps que cela peut prendre.

Alors, que peut-on faire pour accélérer ces types de processus ? Mon ordinateur est-il un facteur limitant ? Y a-t-il des paramètres dans Arc ou sur mon ordinateur qui vous aideront ? Ou est-ce juste une vitesse normale pour ces choses ?

Je demande parce que je pourrais avoir besoin de le faire plus à l'avenir. nous collectons des données à partir de plusieurs sources et les combinons en un seul ensemble de données pour le rendu 3D (je me demande également si ma GeForce GTX 650 avec une mémoire graphique totale de 4095 Mo sera capable de le gérer.)

* Déplacez tout local si vous le pouvez. Le décalage du réseau vous tuera.

*Travailler en petits lots. Vous ne savez pas combien de fichiers vous avez, mais essayez d'en ajouter quelques-uns à la fois. Vous pouvez également essayer de créer plusieurs petits ensembles de données, puis de les fusionner tous à la fin.

* Assurez-vous que l'option Calculer les statistiques et Construire des pyramides est désactivée. Vous pouvez les faire une fois le mosaïquage terminé. Désactivez à peu près tout ce qui est facultatif et exécutez-le à la fin si nécessaire.

*Démarrez le processus à la fin de la journée afin que le temps ne soit pas un facteur.

C'est tout à fait normal et votre machine en est parfaitement capable. ArcMap prend juste une éternité pour faire beaucoup de choses. J'ai trouvé que la configuration du géoprocessus Mosaic To New Raster dans ArcGIS Pro semblait un peu plus rapide, mais elle plantait également un peu plus.

Pourriez-vous poster un lien vers les données que vous utilisez ? Ce serait amusant d'essayer différentes combinaisons de matériel et de logiciel.

Eh bien, il n'y a pas un seul fichier. J'ai rééchantillonné et combiné environ 9 fichiers bathymétriques et DEM différents provenant de diverses sources.

Existe-t-il une demande pour des logiciels plus spécialisés dans ce domaine ? Ce que vous décrivez devrait être réalisable en quelques minutes. (En supposant un accès au disque local.)

Ce que vous décrivez devrait être réalisable en quelques minutes.

Quelques secondes, en fait, si vous avez un SSD, un nombre raisonnable de cœurs dans votre CPU, et que vous utilisez des logiciels parallèles modernes, comme ERDAS ou autres.

Si nous obtenons un contrat, nous pourrions certainement nous tourner vers un logiciel spécialisé. Qu'avais tu en tête?

Peut-être que je peux obtenir un essai gratuit et convaincre quelqu'un de plus haut que cela en vaut la peine.

Facile : utilisez un logiciel parallèle. Le code parallèle prend du temps à écrire, il est donc sage de tester d'abord l'idée pour obtenir une référence de la façon dont cela pourrait fonctionner pour vous, avant d'entreprendre l'effort de codage.

Testez l'approche parallèle à l'aide de FOSS : Viewer est gratuit à partir de http://manifold.net/viewer.shtml

Importez vos images (tout raster, comme les rasters d'altitude de terrain, etc.) dans la visionneuse, puis utilisez la boîte de dialogue Fusionner les images pour les fusionner. Exemple étape par étape utilisant les rasters d'élévation de la navette spatiale SRTM sur http://manifold.net/doc/mfd9/index.htm#example__merge_images.htm - il existe également une version vidéo YouTube de cela.

Si cela fonctionne pour vous et que vous êtes satisfait de la vitesse fournie par le parallélisme, vous pouvez envisager la décision "faire vs acheter" d'implémenter vous-même du code parallèle en utilisant FOSS ou ArcPy ou d'acheter un produit commercial comme ERDAS ou d'autres qui le font pour vous.

Soit dit en passant, le GPU ne joue aucun rôle dans ce domaine, car tout sous-système graphique cheapo peut facilement en gérer l'affichage, et aucun calcul important n'est impliqué dans la fusion des données raster qui justifie le parallélisme GPGPU. Tout cela est plus rapide à paralléliser à l'aide de la parallélisation CPU car il s'agit essentiellement d'un accès aux données et de comparaisons simples, pas de mathématiques. Vous pouvez le faire plus rapidement dans plusieurs cœurs de processeur que d'envoyer de haut en bas vers le GPU.

Si vous écrivez cela vous-même, car l'accès aux données est essentiel, il est important que vous utilisiez un magasin de données parallèle afin que le code mosaïque parallèle à plusieurs voies que vous écrivez ne se bloque pas avec un accès en lecture/écriture à une voie aux données. De même, disposer d'un stockage de données rapide comme dans un SSD, ainsi que de nombreux cœurs de processeur raisonnables, est bien plus important qu'un GPU ou un processeur coûteux où un seul cœur est utilisé.


Bibliothèques Python pour la science des données

La science des données extrait des informations à partir des données. Il prend des données et essaie de les comprendre, par exemple en les traçant graphiquement ou en utilisant l'apprentissage automatique. Cette liste de bibliothèques Python peut faire exactement cela pour vous.

6 NumPy

Numerical Python (bibliothèque NumPy) prend votre table attributaire et la place dans un tableau structuré. Une fois qu'il est dans un tableau structuré, c'est beaucoup plus rapide pour tout calcul scientifique. L'une des meilleures choses à ce sujet est la façon dont vous pouvez travailler avec d'autres bibliothèques Python comme SciPy pour des opérations statistiques lourdes.

7 pandas

La bibliothèque Pandas est extrêmement populaire pour la gestion des données. Ce n'est pas seulement pour les statisticiens. Mais c'est aussi incroyablement utile dans les SIG. Les performances de calcul sont essentielles pour les pandas. Le succès de Pandas réside dans sa trame de données. Les trames de données sont optimisées pour fonctionner avec le Big Data. Ils sont optimisés à un point tel que c'est quelque chose que Microsoft Excel ne serait même pas capable de gérer.

8 Matplotlib

Lorsque vous travaillez avec des milliers de points de données, la meilleure chose à faire est parfois de tout tracer. Entrez matplotlib. Les statisticiens utilisent la bibliothèque matplotlib pour l'affichage visuel. Matplotlib fait tout. Il trace des graphiques, des tableaux et des cartes. Même avec les mégadonnées, il est décent de calculer des chiffres.

9 Scikit

Dernièrement, l'apprentissage automatique a fait le buzz. Et pour cause. Scikit est une bibliothèque Python qui permet l'apprentissage automatique. Il est construit dans NumPy, SciPy et matplotlib. Donc, si vous souhaitez faire de l'exploration de données, de la classification ou de la prédiction ML, la bibliothèque Scikit est un choix décent.

10 Re (expressions régulières)

Les expressions régulières (Re) sont l'outil de filtrage ultime. Lorsqu'il y a une chaîne spécifique que vous souhaitez rechercher dans une table, c'est votre bibliothèque de référence. Mais vous pouvez aller un peu plus loin, comme détecter, extraire et remplacer par la correspondance de motifs.

11 Laboratoire de rapports

ReportLab est l'une des bibliothèques les plus satisfaisantes de cette liste. Je dis cela parce que le SIG manque souvent de capacités de reporting suffisantes. Surtout, si vous souhaitez créer un modèle de rapport, c'est une option fabuleuse. Je ne sais pas pourquoi la bibliothèque ReportLab tombe un peu hors du radar parce qu'elle ne devrait pas.

CONSEIL DE PRO : Si vous avez besoin d'une liste rapide et sale de fonctions pour les bibliothèques Python, consultez les Cheat Sheets de DataCamp.


Utilisation du shell Python

ArcGIS prend en charge une instance shell entièrement fonctionnelle de Python, qui peut être ouverte en cliquant sur l'icône shell Python qui se trouve dans la barre d'outils principale :

Figure 1 - Bouton shell Python.

Cependant, la même interface peut être obtenue en lançant IDLE, l'éditeur et le shell Python qui est installé avec Python. Pour obtenir la même fonctionnalité que le shell dans ArcGIS, à partir de la fenêtre du shell Python, importez le arcpy module dans le shell (arcpy est un gros module, cela prendra donc quelques instants):


Figure 2 - L'interface du shell Python IDLE


Accélérer les appels python répétés (ou, alternativement, porter une regex complexe vers sed)

Je suis un physicien médical universitaire. Je fais des expériences qui génèrent une bonne quantité de données, et elles sont coûteuses à exécuter. Mon université dispose d'un système de sauvegarde qui consiste en une bibliothèque de bandes robotisées dans une mine de sel désaffectée qui utilise Spectrum Protect d'IBM (appelé dsmc ) que j'utilise pour les sauvegardes hors site. Bien qu'il n'y ait pas de limite sur la taille totale que je peux envoyer à la mine de sel, il est une limite de transfert par jour de 200 gigaoctets. Pour autant que je sache, il n'y a aucun moyen d'obliger le client Spectrum Protect à respecter cette limite et à s'arrêter une fois la limite de transfert atteinte.

Si quelqu'un dépasse cette limite, le serveur verrouille le nœud et je dois envoyer un e-mail d'excuse rampant à quelqu'un pour lui demander de le déverrouiller. Ils me reprochent d'utiliser trop de bande passante et, quelque chose comme 24-48 heures plus tard, déverrouillent le nœud.

Pour contourner le fait que je crée des données en morceaux discrets (les jours d'expérimentation) et que je suis bien en dessous de la limite de bande passante sur une base mensuelle ou hebdomadaire, j'ai écrit un script wrapper simple pour analyser la sortie de dsmc et tuez le transfert s'il devient trop volumineux.

L'analyse se fait en traitant la sortie de dsmc comme une doc here dans bash avec un simple script python :

Cela fonctionne et convient à mes objectifs. Cependant, les performances sont mauvaises, voire terribles, et je pense que c'est parce que chaque itération de la boucle while génère une autre instance de la combinaison interpréteur python / script.

Étant donné que je ne peux pas modifier la limite ou le comportement du blob dsmc compilé binaire, j'ai trois questions connexes :

(a) Est-ce une approche sensée pour résoudre ce problème, ou existe-t-il un moyen beaucoup plus simple qui me manque, tel que le vaudou avancé avec netstat ?

(b) Étant donné que quel python fait en fait est essentiellement exactement le même à chaque itération de la boucle, existe-t-il un moyen de mettre en cache la traduction du code par l'interprète et donc d'accélérer considérablement le tout ?

(c ) Si je devais remplacer le script python par une construction sed ou awk équivalente, je soupçonne que tout cela serait beaucoup, beaucoup plus rapide. Pourquoi? Est-il possible de faire ce type d'arithmétique facilement, ou est-ce un autre faux-fuyant à descendre ?

Éditer: Un exemple de sortie de dsmc pour ceux qui ne sont pas familiers est ci-dessous -- un fichier n'est envoyé que si "Fichier normal" apparaît dans une chaîne, suivi de sa taille en octets. Ainsi, dans la suite, le fichier spclicert.kdb est envoyé, mais ni TSM.PWD ni le répertoire CaptiveNetworkSupport :

Ainsi, le script ci-dessus supprime la taille en octets de chaque fichier envoyé et les additionne simplement.


A propos de l'auteur

Michée Babinski

Micah Babinski, GISP, PMP, est chef de projet SIG chez ELYON International, Inc. Il travaille sur site avec le BLM Oregon/Washington. Babinski fait partie de l'industrie des SIG depuis près d'une décennie et a précédemment occupé des postes à la ville de Portland, en Oregon, et dans le comté de Multnomah, en Oregon. Il est diplômé de l'Université de Washington et est un membre actif de l'Urban and Regional Information Systems Association (URISA) et du Project Management Institute (PMI).


Dois-je inclure des scripts dans un package Python ?

Dans mon application Python, je peux faire la distinction entre les points d'entrée (scripts) et ce que je considère comme du code de bibliothèque.

Mon instinct est de mettre le code de la bibliothèque dans un package et les scripts importés ailleurs depuis le package.

Il est possible d'utiliser setup.py pour référencer des méthodes à l'intérieur d'un package à utiliser comme points d'entrée, ayant ainsi tout le code Python à l'intérieur des packages.

Remarque : ce lien traite des deux options mais n'offre pas vraiment d'opinion.

Edit : pour donner un exemple plus concret, je passe en revue du code qui contient un package. Il contient quarante modules :

  • __init__.py
  • 11 "scénarios"
  • 10 « modules de bibliothèque » utilisés par ces scripts
  • 18 modules d'essais

Cela ne donne pas l'impression d'utiliser très bien la capacité des packages, mais je ne peux pas mettre le doigt sur ce qui ne va pas exactement.

J'apprécie que le fait d'avoir des tests dans le même package n'était pas dans ma question d'origine.


Imaginer la feuille de route à venir

Avant de commencer à développer notre application, il est important que nous créions une vision de la façon dont nous voulons structurer notre application. En termes Python, nous allons créer un package à plusieurs niveaux avec divers sous-packages et sous-modules pour prendre en charge différentes parties de nos fonctionnalités, indépendamment de toute interface utilisateur. Ce n'est qu'en plus de cette fonctionnalité sous-jacente que nous créons l'interface utilisateur visuelle comme moyen d'accéder et d'exécuter ce code sous-jacent. De cette façon, nous construisons un système solide et permettons aux utilisateurs expérimentés d'accéder à toutes les mêmes fonctionnalités via des scripts Python pour une automatisation et une efficacité accrues, comme cela existe pour ArcGIS et QGIS.

Pour configurer le package Python principal derrière notre application, créez un nouveau dossier appelé pythongis n'importe où sur votre ordinateur. Pour que Python puisse interpréter le dossier pythongis comme un package importable, il doit trouver un fichier nommé __init__.py dans ce dossier. Effectuez les étapes suivantes :

  1. Ouvert Python IDLE dans le menu Démarrer de Windows.
  2. La première fenêtre à apparaître est le shell interactif. Pour ouvrir la fenêtre d'édition de script, cliquez sur Fichier et Nouvelle.
  3. Cliquer sur Fichier puis Enregistrer sous.
  4. Dans la fenêtre de dialogue qui s'ouvre, naviguez dans le pythongis dossier, tapez __init__.py comme nom de fichier, et cliquez sur sauver.

Il existe deux principaux types de données SIG : vecteur (géométries basées sur des coordonnées telles que des points, des lignes et des polygones) et raster (une grille de points de données ou de cellules régulièrement espacées, semblable à une image et ses pixels).

Pour une introduction plus détaillée aux différences entre les données vectorielles et raster, et d'autres concepts SIG de base, nous renvoyons le lecteur au livre Learning Geospatial Analysis with Python, de Joel Lawhead. Vous pouvez trouver ce livre sur :

https://www.packtpub.com/application-development/learning-geospatial-analysis-python

Étant donné que les données vectorielles et raster sont si fondamentalement différentes à tous égards, nous avons divisé notre package en deux, un pour le vecteur et un pour le raster. En utilisant la même méthode que précédemment, nous créons deux nouveaux dossiers de sous-paquets dans le pythongis paquet un appelé vecteur et un appelé raster (chacun avec le même vide susmentionné __init__.py fichier). Ainsi, la structure de notre package ressemblera à ceci (notez que : paquet ne fait pas partie du nom du dossier):

Pour faire de notre nouveau vecteur et raster sous-paquets importables par notre niveau supérieur pythongis package, nous devons ajouter les instructions d'importation relatives suivantes dans pythongis/__init__.py:

Tout au long de cet article, nous construirons les fonctionnalités de ces deux types de données sous la forme d'un ensemble de modules Python dans leurs dossiers respectifs. Finalement, nous voulons nous retrouver avec une application SIG qui n'a que les outils géospatiaux les plus basiques afin que nous puissions charger, enregistrer, gérer, visualiser et superposer des données.

En ce qui concerne notre produit final, puisque nous nous concentrons sur la clarté et la simplicité, nous ne mettons pas trop d'efforts pour le rendre rapide ou efficace en mémoire. Cela vient d'un dicton souvent répété chez les programmeurs, dont on trouve un exemple dans Programmation structurée avec instructions go to, ACM, Enquêtes informatiques 6 (4) :

L'optimisation prématurée est la racine de tout Mal

Donald E. Knuth

Cela nous laisse avec un logiciel qui fonctionne mieux avec de petits fichiers, ce qui dans la plupart des cas est assez bon. Une fois que vous avez une application fonctionnelle et que vous sentez que vous avez besoin d'une assistance pour des fichiers plus volumineux ou plus rapides, c'est à vous de décider si vous souhaitez faire un effort supplémentaire d'optimisation.

L'application SIG avec laquelle vous vous retrouvez à la fin de l'article est simple mais fonctionnelle et est destinée à servir de cadre sur lequel vous pouvez facilement vous appuyer. Pour vous laisser quelques idées, nous avons placé plusieurs encadrés d'information tout au long de l'article avec des manières d'optimiser ou d'étendre votre application.


Voir la vidéo: Les Tutos Scantrad E1: les scripts (Octobre 2021).