2010-08-19 13 views
10

Tengo un archivo xml que debe leerse muchas veces. Estoy intentando usar Parallel.ForEach para acelerar estos procesos ya que ninguno de los datos que se leen es relevante en cuanto al orden en que se lee. Los datos solo se están utilizando para rellenar objetos. Mi problema es que aunque estoy abriendo el archivo cada vez en el hilo como solo lectura, se queja de que está abierto por otro programa. (No lo tengo abierto en un editor de texto ni nada :))Múltiples subprocesos leyendo desde el mismo archivo

¿Cómo puedo realizar múltiples lecturas desde el mismo archivo?

EDITAR: El archivo es ~ 18 KB bastante pequeño. Se lee de aproximadamente 1,800 veces.

Gracias

+4

Su disco duro solo tiene una cabeza, por lo que solo puede leer una a la vez. ¿Qué mejora en el rendimiento espera de esto? – Daniel

+1

¿Encaja el archivo en la memoria caché de disco? De ser así, las lecturas múltiples serán rápidas; de lo contrario, si el archivo es lo suficientemente pequeño como para caber en la memoria, utilice un archivo mapeado en memoria y lea de allí. De lo contrario, el disco duro perderá mucho tiempo en lugar de realizar lecturas secuenciales, y perderá rendimiento en lugar de ganarlo. – mdma

+1

¿Una cabeza en un disco duro? Estoy bastante seguro de que incluso las unidades de disco único tienen varias cabezas en estos días, así como el almacenamiento en caché, etc. que abordan las ralentizaciones específicas de la cabeza. – GrayWizardx

Respuesta

24

Si quieres varios subprocesos para leer desde el mismo archivo, es necesario que especifique FileShare.Read:

using (var stream = File.Open("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    ... 
} 

Sin embargo, no se va a lograr ningún aumento de velocidad de este, por múltiples razones:

  1. Su disco duro solo puede leer una cosa a la vez. Aunque tiene varios subprocesos ejecutándose al mismo tiempo, estos subprocesos terminarán esperando el uno al otro.
  2. No se puede analizar fácilmente una parte de un archivo XML. Por lo general, tendrá que analizar todo el archivo XML todo el tiempo. Como tiene múltiples hilos que lo leen todo el tiempo, parece que no espera que el archivo cambie. Si ese es el caso, ¿por qué necesita leerlo varias veces?
+0

+1 Para los comentarios "1" y "2". FileAccess.Read y FileShare.Read NO resolverán el problema, cuando varios hilos intentan leer el mismo archivo. Entonces, como se menciona en el comentario "2" si solo necesitamos leerlo, entonces primero podemos leerlo una vez y luego darle a "hacer el procesamiento" para múltiples hilos. – Vytas999

+0

Con respecto al punto 1, esto no se aplica a cosas como las matrices de discos, que para el software del servidor serían fáciles de esperar. – Matt

1

Al abrir el archivo, deberá especificar FileShare.Read:

using (var stream = new FileStream("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    ... 
} 

De esta forma el archivo se puede abrir varias veces para leer

+4

mientras que eso es correcto, a menos que el cartel particione el archivo en bloques, es dudoso que cualquier aceleración real ocurra usando múltiples hilos. –

+3

@Mitch Wheat: de hecho. Pero solo estoy respondiendo la pregunta del OP, no juzgando si usar múltiples hilos es una buena idea;) –

+1

Enseñe a un hombre a pescar y todo eso .... –

3

Dependiendo del tamaño del archivo y el tipo de lecturas que hace puede ser más rápido para cargar primero el archivo en la memoria y luego proporcionar acceso directamente a sus hilos.

No proporcionó ninguna información específica sobre el archivo, las lecturas, etc. por lo que no puedo decir con certeza si se ocuparía de sus necesidades específicas.

La premisa general sería cargar el archivo una vez en un único subproceso y, a continuación, directamente (a través de la estructura Xml) o indirectamente (a través de XmlNodes, etc.) proporcionar acceso al archivo a cada uno de sus subprocesos. Me imagino algo similar a:

  1. carga el archivo
  2. Para cada expedición consulta XPath los nodos que coinciden con sus hilos.

Si los hilos no modifican el XML directamente, esta podría ser una alternativa viable.

+0

Intentaré cargarlo en la memoria, gracias por la idea. – Pieces

Cuestiones relacionadas