Github

Ce script Python convertit un fichier STL en un fichier GLB. Il utilise la bibliothèque trimesh pour lire et exporter les fichiers.

Ce script prend en charge le traitement par lots, il conserve le nom de fichier et la structure de répertoire d’origine.

Installation

Python 3 est requis pour exécuter ce script.

Il est recommandé d’utiliser un environnement virtuel pour installer les bibliothèques requises.

python -m venv venv
source venv/bin/activate

Vous pouvez installer les bibliothèques requises avec la commande suivante:

pip install -r requirements.txt

Usage

Pour convertir un fichier spécifique, vous pouvez lancer le script avec la commande suivante:

python ./stl2glb.py -i ./input_path/file.stl -o ./output_path/

Pour traiter plusieurs fichiers à la fois, vous pouvez lancer le script avec la commande suivante:

python ./stl2glb.py -i ./input_path/ -o ./output_path/

Arguments

  • -i ou --input: Chemin du fichier ou du répertoire d’entrée.
  • -o ou --output: Chemin du répertoire de sortie.
  • --log-level (optionnel): Niveau de log pour le script. La valeur par défaut est WARNING. Les valeurs possibles sont DEBUG, INFO, WARNING, ERROR, CRITICAL.
  • -t ou --threads (optionnel): Nombre de processus à utiliser. La valeur par défaut est 0 (mode automatique).

Avertissement

This script will overwrite the output files if they already exist.

Performance

Ces tests ont été réalisés par curiosité pour explorer le comportement de différentes façons de gérer le parallélisme en Python. Les premiers tests utilisent Thread de concurrent.futures pour obtenir du parallélisme, tandis que les seconds utilisent Process.

Ordinateur

  • CPU: Intel(R) Core(TM) i7-10875H (8c-16t) CPU @ 2.30GHz
  • RAM: 2x8GB DDR4-3200
  • OS: Ubuntu 24.04.1 LTS (6.8.0-52-generic)
  • Python: 3.12.3

Bibliothèques:

  • numpy: 2.2.2
  • trimesh: 4.6.1

Mesures

Les tests ont été effectués avec 10001, 1001 et 101 fichiers. Le modèle utilisé est RPI_3bplus_enclosure_upper_2.0.STL de mon projet de boitier Raspberry PI 1-3, il contient 6 572 triangles et pèse 321 ko.

Le temps d’exécution est mesuré en utilisant la commande time en zsh.

Les données brutes sont disponibles ici

Nous pouvons voir que pour ce script, utiliser des processus est plus efficace que d’utiliser des threads. Évidemment, plus il y a de fichiers, plus le parallélisme est utile. Pour une petite charge de travail (101 fichiers), la différence est négligeable. Mais pour une grande charge de travail (10001 fichiers), la différence est significative.

Thread Process comparison for 101 files Thread Process comparison for 10001 files

Pour les threads, le nombre optimal est autour de 8 threads, en en utilisant plus la performance diminue. Cela peut être dû au GIL qui limite les performances des threads.

Pour les processus, le nombre optimal est autour de 16 processus. Cela peut être dû au nombre de cœurs disponibles sur la machine. La différence entre 16 et 8 est négligeable, cela peut être dû aux limites d’E/S mais aussi au Turbo Boost. Car plus de cœurs sont utilisés, plus la fréquence de chaque cœur est basse. Pour une charge de travail importante (10001 fichiers), nous pouvons voir que l’utilisation de 32 processus est un peu plus rapide que l’utilisation de 16 processus. Cela peut être dû à la concurrence pour le temps CPU entre les autres processus s’exécutant sur la machine.

Time decrease (lower is better)

Conclusion

J’ai écrit ce script pour convertir mes fichiers STL en fichiers GLB pour mon site web. La charge de travail typique est d’environ 100 fichiers à la fois lorsque je mets à jour mon site web. Cela a pris environ 1 seconde, donc le parallélisme n’est pas vraiment utile. Mais comme nous pouvons le voir, les processus sont toujours plus rapides que les threads, même pour une petite charge de travail. C’est pourquoi je garde le parallélisme avec les processus comme option dans le script.

Par défaut, le script essaiera d’utiliser un nombre optimal de processus en fonction du nombre de cœurs disponibles sur la machine. Mais vous pouvez toujours spécifier le nombre de processus à utiliser.

Algorithme de décision du nombre de processus
flowchart LR A[Start] --> B{"len(input_files) < MIN_CHUNK_SIZE"} B -->|"True"| C[Single Process] B -->|"False"| D["query_process = len(input_files) // MIN_CHUNK_SIZE"] D --> E{"query_process < available_core"} E -->|"True"| F["query_process"] E -->|"False"| G["available_core"]