2011-08-21 44 views
5

Vì vậy, tôi đã cố gắng:Tăng ổ cắm asio: cách nhanh nhất để đọc tệp từ ổ đĩa cứng?

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

Tôi tự hỏi làm thế nào bạn làm điều đó - làm thế nào để làm điều đó nhanh hơn?

Ứng dụng của tôi sẽ hoạt động trên Windows, linux và mac os. Đó là lý do tại sao tôi sử dụng rất nhiều. Tôi sử dụng ab để thử nghiệm. Tôi muốn có được 2 hoặc ít nhất 1,5 lần nhanh hơn về đọc và gửi tệp. Có thể được tăng cường :: Iostream có thể giúp tôi bất kỳ cách nào?

+0

Bạn gửi bao nhiêu tệp cùng một lúc (cái này theo cái kia)? Các tệp của bạn lớn đến mức nào? –

Trả lời

0

Nếu những gì bạn đang cố gắng tối ưu hóa đang gửi tệp từ đĩa qua ổ cắm, hãy xem sendfile(2) nếu bạn đang sử dụng Linux. Nó được thiết kế đặc biệt cho mục đích này.

Nếu bạn muốn gắn bó với thứ gì đó giống như những gì bạn có bây giờ, nhưng điều chỉnh nó, tôi sẽ thử làm cho bộ đệm là một số lượng nhỏ megabyte thay vì chỉ 8 KB.

+1

Tương đương với Windows với 'sendfile' là [' TransmitFile'] (http://msdn.microsoft.com/en-us/library/ms740565%28v=VS.85%29.aspx) – Hasturkun

+0

Có phải tệp tin gửi có sẵn trên MacOsX không? – Rella

+0

@Kabumbus: vâng, sendfile có sẵn trên OS X: http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/sendfile.2.html –

0

boost :: ASIO đã bọc TransmitFile, xem sau example

+1

Lưu ý rằng ví dụ này là Windows cụ thể –

1

Không hoàn toàn chắc chắn những gì bạn đang sau, nhưng để trả lời câu hỏi của bạn về việc đọc nhanh các tập tin bạn có thể bản đồ các tập tin vào bộ nhớ.

Bằng cách này bạn đọc từ bộ nhớ thay vì từ đĩa. Tùy thuộc vào kích thước tệp và có các cách tiếp cận khác nhau có thể thú vị, ví dụ: ánh xạ toàn bộ tệp nếu các vùng nhỏ hoặc bản đồ của tệp trong suốt tệp khi bạn xử lý tệp nếu đó là tệp lớn.

Trong Boost.Interprocess, bạn có thể đọc thêm về điều này here.

Các vấn đề liên quan