Como mencioné en el correo aun queda trabajo por hacer...

No veo que la función get_block_size se esté usando en ninguna parte. Por otra parte, el módulo os.statvfs está marcado para obsolescencia (deprecated) desde la python 2.6 y de hecho lo quitaron de la versión 3, no sería mejor sustituirlo con algo mas reciente?

La función no se usa, inicialmente intenté hacer una optimización teniendo en cuenta el tamaño de bloque del HDD, pero resulta que python se encarga de ello (y el SO y el firmware de los HDD) así que en realidad solo es necesario definir el tamaño del buffer de memoria, y para ello no hace falta tener en cuenta el tamaño de bloque. Aún esta el código por si es necesario hacer algunas pruebas, pero de momento no se usa, en caso de ser necesario, le voy a buscar un reemplazo a os.statvfs.

Aparte de utilizar threads y un buffer de 16M para los datos a copiar, utilizas algun otro criterio de optimización?
El principal criterio de optimización es la filosofía de "lee una vez y escribe a todos", los hilos se utilizan para intentar escribir al mismo tiempo en distintos dispositivos, inicialmente utilizaba multiprocessing, para aprovechar los procesadores con múltiples núcleos, que es lo normal hoy en día, pero resulta que hay algún problema extraño con la GIL y cuando se le agrega una GUI con Qt se enlentece demasiado, cosa que no ocurre con los hilos, el lado bueno es que no hay diferencias de rendimiento entre multiprocessing y threads en cuanto a IO debido a que el cuello de botella es la lectura y escritura en si.

El tamaño del buffer de memoria es algo en lo que estoy trabajando (el algoritmo para definir el tamaño), de momento tiene un valor por defecto y una opción para modificarlo.

Los principales factores a tener en cuenta en el tamaño del buffer de memoria son principalmente: la cantidad de memoria RAM libre, el tamaño del fichero a copiar, el tamaño del buffer del sistema de ficheros, y el tamaño del buffer del dispositivo, pero digo principalmente, porque hay muchos mas, que incluso cambian en el mismo sistema... pero bueno, se puede lograr un valor aceptable haciendo unas pruebas escribiendo a un fichero temporal, el problema viene cuando se va a escribir a distintos HDD que pueden tener sistemas de ficheros distintos y tamaños distintos del buffer de escritura, así es un poco mas complicado determinar un buen valor.

De momento la optimización real esta en la función copy_file, la cual lee de la fuente y copia al mismo tiempo hacia los destinos, el tamaño del buffer de 16x1024x1024 es un tamaño considerado bueno para la mayoría de los dispositivos que se usan hoy en día, pero se puede mejorar.


Por cierto, yo actualizaría las unidades de medida para que realmente representaran multiplos de 1024:

suffixes=['B','KiB','MiB','GiB','TiB']

Si, o pasar a usar 1000 como casi todo el mundo... que crees mejor?

Esa función aún no se esta usando, al igual que la medición del progreso, es que el poner una barra de progreso enlentece considerablemente la copia, y el objetivo principal es la velocidad, la idea es incluir una opción para mostrar el progreso, pero opcional, o mostrarlo fichero a fichero, o cada un numero determinado de iteraciones.


Saludos.



--
Este mensaje le ha llegado mediante el servicio de correo electronico que 
ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema 
Nacional de Salud. La persona que envia este correo asume el compromiso de usar 
el servicio a tales fines y cumplir con las regulaciones establecidas

Infomed: http://www.sld.cu/



______________________________________________________________________
Lista de correos del Grupo de Usuarios de Tecnologías Libres de Cuba.
Gutl-l@jovenclub.cu
https://listas.jovenclub.cu/cgi-bin/mailman/listinfo/gutl-l

Responder a