2011-08-21 10 views
5

だから私は試してみました:ブーストasioソケット:ハードドライブからファイルを読み込む最速の方法は?

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); 
} 

を、私はあなたがそれを行う方法を疑問に思う - より速くそれを行う方法?

私のアプリはWindows、Linux、Mac OSで動作します。それで私はブーストをたくさん使うのです。私はabを使ってテストしています。私は、ファイルを読んだり、送信したりするのに2倍以上、あるいは少なくとも1.5倍速くしたいと思っています。 Boost :: Iostreamはどのように手助けできますか?何を最適化しようとしていることは、ソケット間でディスクからファイルを送信している場合は、Linux上でなら

+0

一度にいくつのファイルを送信しますか(1つずつ)ファイルのサイズは通常どのくらいですか? –

答えて

0

sendfile(2)をチェックしてください。この目的のために特別に設計されています。

あなたはより多くのあなたが今持っているもののようなものに固執したい場合は、しかしチューンそれ、私はバッファが小さなメガバイト数だけではなく、8キロバイトも作ってみたいです。すでにTransmitFileを巻いた

+1

'sendfile'へのWindowsと同等である[' TransmitFile'](http://msdn.microsoft.com/en-us/library/ms740565%28v=VS.85%29.aspx) – Hasturkun

+0

はMacOSXの上のsendfile avaliableていますか? – Rella

+0

@Kabumbus:はい、sendfileのは、OS X上で利用可能です:!http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/sendfile.2.html –

0

ブースト:: ASIO、以下を参照してください。あなたは後にしているが、あなたはメモリにファイルをマップすることができ、ファイルの速読に関するご質問にお答えするためにどのようなexample

+1

この例はWindows固有のものです –

1

全くわかりません。

この方法で、ディスクからではなくメモリから読み込みます。ファイルサイズなどに応じて、興味深いさまざまなアプローチがあります。小さなファイルの場合はファイル全体をマップし、大きなファイルの場合はファイル全体のファイルの領域を処理します。

Boost.Interprocessでは、このhereについての詳細を読むことができます。

関連する問題