es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

akka-http – Tamaño de lote de transmisión de Multipart/FormData

Estoy recibiendo un Multipart/FromData como servidor. Esta solicitud contiene Source[Multipart.FormData.BodyPart, Any] y cada Multipart.FormData.BodyPart contiene Source[ByteString, Any] en su interior. Soy capaz de establecer un tamaño de búfer. Pero mide en cantidad de elementos. ¿Cómo puedo calcular el tamaño de cada elemento ByteString (tamaño de lote)? Necesito calcular todo el tamaño del búfer en bytes.

scala
entity(as[Multipart.FormData]) { formData =>
formData
.parts // Source[Multipart.FormData.BodyPart, Any]
.flatMap { bodyPart =>
bodyPart.entity.dataBytes.buffer(???, OverflowStrategy.backpressure) // Source[ByteString, Any]
}
}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para calcular el tamaño de cada elemento ByteString en bytes, se puede usar la función map para transformar cada elemento del flujo en su tamaño utilizando el método ByteString.length. Esto le dará una Source[Int, Any] que representa el tamaño de cada elemento en bytes.

    entity(as[Multipart.FormData]) { formData =>
    formData
       .parts // Source[Multipart.FormData.BodyPart, Any]
       .flatMap { bodyPart =>
          bodyPart.entity.dataBytes.map(_.length) // Source[Int, Any]
            .buffer(???, OverflowStrategy.backpressure) // tamaño del buffer en número de elementos
       }
    }
    

    Para calcular el tamaño total del buffer en bytes, se puede multiplicar el tamaño del buffer por el tamaño promedio de cada elemento. Se puede calcular el tamaño promedio de cada elemento utilizando la función reduce para sumar todos los tamaños de los elementos y luego dividiendo por el número total de elementos utilizando la función runFold.

    entity(as[Multipart.FormData]) { formData =>
      formData
        .parts // Source[Multipart.FormData.BodyPart, Any]
        .flatMap { bodyPart =>
          bodyPart.entity.dataBytes.map(_.length) // Source[Int, Any]
            .buffer(???, OverflowStrategy.backpressure) // tamaño del buffer en número de elementos
        }
        .runFold(0L -> 0L) { case ((totalSize, count), size) =>
          (totalSize + size, count + 1)
        }
        .map { case (totalSize, count) =>
          (totalSize.toDouble / count).ceil.toLong * bufferCount // bufferCount es el tamaño del buffer en número de elementos
        }
    }
    

    Esto le dará el tamaño total del buffer en bytes, redondeado al múltiplo más cercano del tamaño promedio de los elementos.

Comments are closed.