Pregunta

Estoy desarrollando en Python, todavía nuevo en el juego, y quiero asegurarme de que frente a este problema correctamente. Voy a aceptar de buen grado todos los consejos.

Imagínese tratando de utilizar los datos almacenados en varios archivos planos, en muchos casos con un tamaño combinado superior a 20-35 gb. En el caso más general, estos archivos pueden estar delimitados (csv, tab) o simplemente pueden ser fijos anchura. El objetivo es tomar estos archivos, o algún subconjunto de cada archivo, se analiza la entrada (cada columna representa una variable de datos), y enviarlo a algún destino (que podría ser SQL local o remoto, algún otro archivo local en una variedad de formatos de salida incluyendo texto o algún formato de datos propietario como .dta de Stata)

El objetivo es utilizar los recursos del sistema disponibles para llevar a cabo esta operación de la manera más rápida posible (supongo que en términos de KB por segundo?)

Preguntas:

  1. ¿Hay un aumento de la eficiencia del compilado utilizando C para hacer las operaciones de lectura? Si es así, que la biblioteca debería aprender a usar? Y, también debe c hacer el análisis y la salida?

  2. Si el archivo viene en un .zip o .gz, debe todo el archivo ser descomprimido antes de la lectura y la escritura, o hacer lo deja comprime y se utiliza una biblioteca capaz de leer desde el archivo comprimido?

  3. debe utilizar el programa multi-threading? Imagino leer algún subconjunto de un archivo (por ejemplo, n líneas a la vez), el análisis y la salida en, por ejemplo, hilos j. No es obvio que la lectura del archivo de una línea a la vez es óptima ... y parece que el número óptimo de hilos y procesos dependerá de los recursos disponibles y el tamaño del trabajo.
    Por lo tanto, puede que el código debe ser lo suficientemente 'inteligente' para determinar de manera óptima cuántos hilos de usar y cuánto trabajo se debe esperar que cada hilo de hacer.

  4. ¿Cómo se puede medir y comparar la eficiencia entre los diferentes métodos?

  5. Si el programa sea capaz de hacer esto de forma dinámica y elegir los métodos de entrada de salida en función de su rendimiento? (Método Un método siempre estrictamente dominan B, o hacer cambios idiosincrásicos en el asunto entorno de despliegue)

Para ser claro, estoy dispuesto a aceptar casi cualquier nivel de ineficiencia código a cambio de mejoras no despreciables en la eficiencia de recursos

espero que estas preguntas proporcionan una idea clara de lo que estoy tratando de averiguar. Mi experiencia en programación se limita principalmente a los paquetes de científicos / estadística, por lo que si cualquiera de mis preguntas se reducen a 'RTM', por favor ser suave y sugieren el manual correspondiente.

¿Fue útil?

Solución

  

¿Hay un aumento de la eficiencia del uso de C compilado para hacer las operaciones de lectura?

En realidad no. La limitación será el ancho de banda de E / S y Python utiliza las bibliotecas de C subyacentes.

  

Si el archivo viene en un .zip o .gz, debe todo el archivo ser descomprimido antes de la lectura y la escritura, o hacer lo deja comprime y se utiliza una biblioteca capaz de leer desde el archivo comprimido?

En primer lugar, conseguir todo lo demás para funcionar bien. No trate a la delicadeza este frente para arriba. ZipFile aplicación de Python puede procesar archivos en formato CSV por los miembros del archivo ZIP apertura sin expandir ellos.

¿Es esto más rápido? No se puede saber de antemano. Sólo se puede conocer mediante la construcción y medición de lo que construyó. No exprimir sus manos. Es sólo unas pocas líneas de código. Construir ambos.

  

En caso del uso del programa multi-hilo?

No.

El uso del sistema operativo multi-nivel de procesamiento.

python something.py source.zip | python part2.py | python part3.py | python part4.py >result

Esta será increíblemente rápido y - sin mucho trabajo -. Va a utilizar todos los recursos disponibles del sistema operativo

  

¿cómo se mide y compara la eficiencia entre los diferentes métodos?

Ummm ... Esa es una pregunta tonta. A construir y medirlo. tiempo transcurrido es tan bueno una medida como cualquier otra cosa. Si usted está confundido, usar un cronómetro. Seriamente. No hay magia.

  

Si el programa sea capaz de hacer esto de forma dinámica y elegir los métodos de entrada de salida en función de su rendimiento?

No.

  

(método A siempre estrictamente dominan el método B, o hacer cambios idiosincrásicos en el asunto entorno de despliegue)

Sí. Y si. Algunos métodos son siempre más eficiente. Sin embargo, un sistema operativo es terriblemente complejo, por lo sustitutos para nada sencilla, diseño flexible, componentizado.

Construir piezas simples que se pueden recombinar con flexibilidad.

No mano, le retuerce con antelación. Diseñar la estructura de datos correcta y el algoritmo cuando pueda. Cuando no se puede, sólo debes elegir algo sensato y seguir adelante. La construcción y puesta a punto algo es mucho más fácil que preocuparse sobre los detalles, sólo para descubrir que nunca importaban.

  1. construir algo.

  2. Medida.

  3. Encuentra el cuello de botella.

  4. Optimizar Sólo los cuellos de botella probadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top