Performance issues with shutil.copytree on windows
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Feature or enhancement
Proposal:
I noticed that Conan seemed to softlock while building clang-tidy on Windows, and I wondered why. After digging around for a while I found that _copy_sources call shutil.copytree which seems to get stuck for a long time. It's technically not stuck, but simply slow.
To compare I wanted to try robocopy so that I can have performance numbers, so I patched installer.py._copy_sources :
start_time = time.time()
shutil.copytree(source_folder, build_folder, symlinks=True)
end_time = time.time()
print(end_time - start_time)
This runs for 1329.195054769516s
start_time = time.time()
out = subprocess.run(['robocopy', '/ndl', '/nfl', '/sl', '/S', source_folder+'\\', build_folder+'\\'])
assert out.returncode <= 1 # 1 and 0 are not errors anything else should contain an error
end_time = time.time()
print(end_time - start_time)
this runs for 92.37016916275024s
The copied folder contains just the llvm source code as shipped in their release page. This is not a theoretical workload.
So robocopy is significantly faster, finishing in 1.5m, while shutil needed 22 minutes.
This solution is obviously not clean and takes a lot more space on disk (no longer creating symlinks) but it does show that there is indeed a big performance issue with shutil with high file count copies.
I will update this issue tomorrow with performance numbers for symlinks=false.
Has this already been discussed elsewhere?
It was already discussed on Discourse a while ago
Links to previous discussion of this feature:
At the time the only proposition was using multi threading. I did not benchmark their solution as at the time it was found inadequate but maybe now that the GIL is less of an issue it is worth considering again.
https://github.com/python/cpython/issues/124117
https://discuss.python.org/t/significantly-improve-shutil-copytree/62078/25
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza por installer.py._copy_sources y la llamada a shutil.copytree descrita en el informe. Reproduce el benchmark de copia en Windows usando la carga de trabajo de código fuente de LLVM, compara symlinks=True y symlinks=False como se propone, y revisa el issue 124117 además de la discusión de Discourse enlazada. Se considera terminado cuando haya una mejora acordada y medida que preserve la semántica de copia requerida.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- operating-systems, performance
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100