pipes - Pipe vs. Archivo Temporal
filtros en unix (4)
A menos que mi comprensión de las tuberías en completamente fuera de la pared, la respuesta es SÍ.
Escribir en un archivo temporal implica el acceso al disco y la sobrecarga asociada.
Escribir en una tubería, y leer de ella, sucede en la memoria. Mucho mas rápido.
¿Hay una gran diferencia de rendimiento entre:
- Procese la escritura A en un archivo temporal y procese B leyendo ese archivo
- Procesar una escritura en una tubería y procesar la lectura B de esa tubería
Tengo curiosidad por saber cuál es la respuesta para Windows y * nix.
EDITAR: Debería haber preguntado: ¿El caché del búfer elimina la diferencia entre un archivo temporal y un conducto?
La gran diferencia es que el primer método realmente utiliza el almacenamiento en disco, mientras que una tubería utilizará la memoria (a menos que se vuelva muy pedante y empiece a pensar en el espacio de intercambio).
En cuanto al rendimiento, la memoria es más rápida que el disco (casi siempre). Esto debería ser generalmente cierto para todos los sistemas operativos.
El único momento en que usar un archivo temporal realmente tiene sentido es si el proceso B tiene que examinar los datos en varias pasadas (como ciertos tipos de codificación de video). Para este uso, todo el flujo de datos tendría que estar almacenado en búfer y si hubiera suficientes datos sí, probablemente anularía la ventaja de la memoria. Por lo tanto, para las operaciones de paso múltiple (búsqueda enlazada), vaya con un archivo temporal.
Pensé que una respuesta práctica podría ayudar. Estoy optimizando la velocidad de un script que uso que tiene aproximadamente 4 pasos. Lo configuré para usar métodos de tuberías y no tuberías. Esto es bajo Windows 7 de 64 bits.
Obtuve una desaceleración del 3% por no usar tuberías. Lo que vale la pena, para mí, porque ahora puedo detenerme entre cada paso y actualizar el título de la ventana, cosa que no pude hacer cuando todo fue un comando.
Personalmente, me quedo con ese 3% de éxito para los títulos de la ventana.
Por curiosidad, estoy preparando un archivo> 20M, luego pasándolo a un script perl especializado que modifica los resultados, luego los clasifico usando ventanas incorporadas en SORT.EXE, luego las unifico usando UNIQ.EXE de cygwin, y luego volviendo a grepping esos mismos resultados para obtener colorantes de resultados de grep basados en ANSI. La mayor parte del tiempo se pasa en la fase de clasificación.
Una gran diferencia es que con la tubería, los procesos A y B pueden ejecutarse simultáneamente, por lo que B comienza a trabajar en la salida de A antes de que A termine de producirla. Además, el tamaño de la tubería es limitado, por lo que A no podrá producir muchos más datos de los que B ha consumido; se hará esperar a que B se ponga al día.
Si el volumen de datos es grande, la escritura en el archivo temporal implica actividad en el disco, aunque solo sea para crear y luego destruir el archivo. Los datos pueden permanecer en las agrupaciones de búferes en memoria, por lo que no hay E / S en el disco, incluso para archivos sorprendentemente grandes. Escribir en la tubería "nunca" implica escribir en el disco.