2011-08-21 19 views
5

así que he intentado:Boost asio Boost: forma más rápida de leer archivos desde el disco duro?

int buff_length = 8192; 
ifstream stream; 
char* buffer = new char[buff_length]; 

stream.open(path.string().c_str(), ios::binary); 

boost::system::error_code ignored_error; 

while (stream) 
{ 
    stream.read(buffer, buff_length); 
    boost::asio::write(*socket, boost::asio::buffer(buffer, stream.gcount()), 
          boost::asio::transfer_all(), ignored_error); 
} 

Me pregunto cómo lo hace - cómo hacerlo más rápido?

Mi aplicación funcionará en Windows, Linux y Mac OS. Es por eso que uso mucho impulso. Yo uso ab para la prueba. Quiero obtener 2 o al menos 1.5 veces más rápido al leer y enviar archivos. Puede ser Boost :: Iostream puede ayudarme de alguna manera?

+0

¿Cuántos archivos envías a la vez (uno después del otro)? ¿Qué tan grande son sus archivos típicamente? –

Respuesta

0

Si lo que está tratando de optimizar es enviar un archivo desde un disco a través de un socket, consulte sendfile(2) si está en Linux. Está específicamente diseñado para este propósito.

Si quieres quedarte con algo más parecido a lo que tienes ahora, pero sintonízalo, trataré de hacer que el buffer sea una pequeña cantidad de megabytes en lugar de solo 8 KB.

+1

El equivalente de Windows a 'sendfile' es [' TransmitFile'] (http://msdn.microsoft.com/en-us/library/ms740565%28v=VS.85%29.aspx) – Hasturkun

+0

¿Está el archivo send disponible en MacOsX? – Rella

+0

@Kabumbus: sí, sendfile está disponible en OS X: http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/sendfile.2.html –

0

impulso :: asio ya ha envuelto TransmitFile, consulte la siguiente example

+1

Tenga en cuenta que este ejemplo es específico de Windows –

1

No del todo seguro de lo que está buscando, pero para responder a su pregunta sobre la lectura rápida de archivos que puede mapear el archivo en memoria.

De esta manera lee de la memoria en lugar de desde el disco. Dependiendo del tamaño del archivo, hay diferentes enfoques que pueden ser interesantes, p. mapee todo el archivo si es pequeño o asigne regiones de archivo a lo largo del archivo mientras lo procesa si se trata de un archivo grande.

En Boost.Interprocess, puede leer más sobre esto here.