Tengo que transferir archivos grandes entre computadoras a través de conexiones no confiables usando WCF.Memorystream y Large Object Heap
Como deseo poder reanudar el archivo y no quiero estar limitado en mi tamaño de archivo por WCF, estoy fragmentando los archivos en 1MB. Estos "trozos" se transportan como una secuencia. Lo cual funciona bastante bien, hasta ahora.
Mis pasos son:
- filestream abierta
- lectura trozo del archivo en bytes [] y crear MemoryStream
- trozo de transferencia de
- de nuevo a 2. hasta que todo el archivo se envía
Mi problema está en el paso 2. Supongo que cuando creo una secuencia de memoria desde una matriz de bytes, terminará en LOH y ultima tely causa una excepción fuera de la memoria. Realmente no pude crear este error, tal vez estoy equivocado en mi suposición.
Ahora, no quiero enviar el byte [] en el mensaje, ya que WCF me dirá que el tamaño de la matriz es demasiado grande. Puedo cambiar el tamaño de matriz máximo permitido y/o el tamaño de mi fragmento, pero espero que haya otra solución.
Mi pregunta real (s):
- ¿Mi solución actual crear objetos en la LOH y tendrá que me causa problema?
- ¿Hay una mejor manera de resolver esto?
Por cierto: en el lado de la recepción, simplemente leo trozos más pequeños de la secuencia de llegada y los escribo directamente en el archivo, por lo que no involucran arrays de bytes grandes.
Editar:
solución actual:
for (int i = resumeChunk; i < chunks; i++)
{
byte[] buffer = new byte[chunkSize];
fileStream.Position = i * chunkSize;
int actualLength = fileStream.Read(buffer, 0, (int)chunkSize);
Array.Resize(ref buffer, actualLength);
using (MemoryStream stream = new MemoryStream(buffer))
{
UploadFile(stream);
}
}
¡Muchas gracias! Esta es en verdad una respuesta brillante. Gracias por señalar el problema Array.Resize. Tampoco había oído hablar de BufferManager, parece que esto también me ayudará mucho en otras áreas. Esto es mucho más de lo que esperaba, así que pensé en comenzar una pequeña recompensa y dártela, pero tengo que esperar 23 horas después de comenzar una recompensa ...Entonces tienes que esperar también :) – flayn
Gracias por eso. Estoy muy contento de poder ser de ayuda. Avísame si hay algo más. Mirando hacia atrás, podría valer la pena señalar que la implementación óptima compartiría una única instancia de BufferManager en todo el servicio. No sé qué tan práctico sería para ti. –
+1 Acabo de tropezar con este buscando una respuesta a un problema similar. Nunca escuché sobre BufferManager antes - ¡increíble! Supongo que esto será algo para recordar en el futuro. –