Estoy escribiendo un descompresor multiproceso en python. Cada hilo necesita acceder a un fragmento diferente del archivo de entrada.Lectura de un único archivo de varios subprocesos en python
Nota 1: no es posible cargar todo el archivo, ya que oscila entre 15 Gb y 200 Gb; No estoy usando multihebra para acelerar la lectura de datos, pero la descompresión de datos, solo quiero asegurarme de que la lectura de datos no desacelere la descompresión.
Nota 2: el GIL no es un problema, ya que la función descompresora principal es una extensión C y llama a Py_ALLOW_THREADS, por lo que se libera el GIL durante la descompresión. La descompresión de la segunda etapa usa numpy, que también está libre de GIL.
1) que supone que no funcionaría para compartir simplemente un objeto descompresor (que básicamente se ajusta un objeto de archivo), ya que si el subproceso A llama al siguiente:
decompressor.seek(x)
decompressor.read(1024)
e hilo B hace lo mismo, hilo A podría terminar leyendo desde el desplazamiento del hilo B. ¿Es esto correcto?
2) En este momento simplemente estoy haciendo que cada hilo cree su propia instancia de descompresor y parece que funciona, pero no estoy seguro de que sea el mejor enfoque. que considera estas posibilidades:
añadir algo como
seekandread(from_where, length)
a la clase descompresor, que adquiere un bloqueo, busca, lee y libera el bloqueo;
Crea un hilo que espera solicitudes de lectura y las ejecuta en el orden correcto.
Entonces, ¿me falta una solución obvia? ¿Hay una diferencia de rendimiento significativa entre estos métodos?
Gracias
Leer un archivo de manera multiproceso realmente ralentiza el proceso cuando tiene un disco duro. La aguja tiene que saltar de un lugar a otro en lugar de trabajar de forma iterativa. Debe cargar el archivo antes de procesarlo. –
No es posible cargar todo el archivo, ya que oscila entre 15 Gb y 200 Gb; No estoy usando multihebra para acelerar la lectura de datos, pero la descompresión de datos, solo quería asegurarme de que la lectura de datos no desacelere la descompresión. – Alberto
Por supuesto, esto puede o no aplicarse a las SSD. Aunque no tengo ni idea sobre el tema. No debe retransmitir en el hardware para hacerlo. Una vez que las SSD son lo suficientemente comunes, realizar E/S de manera multiproceso puede ser eficiente. –