2009-03-15 32 views
5

Tình huống là: có một tệp với 14 294 508 số nguyên không dấu và 13 994 397 số dấu phẩy động (cần phải đọc double s). Tổng kích thước tệp là ~ 250 MB.Cách thực hiện nhập liệu được định dạng nhanh từ luồng trong C++?

Sử dụng std::istream mất ~ 30 giây. Đọc dữ liệu từ tập tin vào bộ nhớ (chỉ cần sao chép byte, không có đầu vào được định dạng) nhanh hơn nhiều. Có cách nào để cải thiện tốc độ đọc mà không thay đổi định dạng tệp không?

+0

Tôi nghĩ bạn nên đăng mã vòng lặp – Ben

+0

Nếu đây là MSVC libs bạn có thể muốn điều tra số tiền phạt mà bạn đang phát sinh từ SECURE_SCL (theo mặc định). Hãy cẩn thận để hiểu được ý nghĩa của việc tắt nó đi. – Functastic

+0

Xin lỗi, đó phải là: _SECURE_SCL – Functastic

Trả lời

3

Bạn có cần sử dụng kiểu STL i/o không? Bạn phải xem this tác phẩm xuất sắc từ một trong những chuyên gia. Đó là một chuyên ngành iostream bởi Dietmar Kuhl.

Tôi ghét đề xuất điều này nhưng hãy xem các thường trình định dạng i/o được định dạng C. Ngoài ra, bạn có đang đọc toàn bộ tệp trong một lần không?

+0

Cú pháp và cách tiếp cận không quan trọng :) Và có, tôi đang đọc toàn bộ tệp. –

+0

Bạn đã thử fscanf và bạn bè chưa? Tôi muốn nói cho một shot, và đo lường. – dirkgently

1

Bạn cũng có thể muốn nhìn vào thư viện FastFormat Matthew Wilson:

tôi đã không sử dụng nó, nhưng ông đã làm cho một số tuyên bố khá ấn tượng và tôi đã tìm thấy rất nhiều công việc khác của mình đáng để học và sử dụng (và ăn cắp nhân dịp).

+0

Có hỗ trợ nhập liệu được định dạng không? –

+0

Crap - bạn nói đúng ... Nó chỉ là định dạng đầu ra. –

+0

Có thể các kỹ thuật có thể được áp dụng cho đầu vào – dcw

1

Bạn chưa chỉ định định dạng. Có thể bạn có thể nhớ bản đồ nó, hoặc có thể đọc trong các khối rất lớn và quá trình trong một thuật toán lô.

Ngoài ra, bạn chưa biết liệu bạn có chắc chắn rằng tệp và quy trình đọc sẽ nằm trên cùng một nền tảng hay không. Nếu một quy trình lớn cuối cùng viết nó và một quá trình nhỏ sẽ đọc nó, hoặc ngược lại, nó sẽ thắng;

1

Nhập liệu phân tích cú pháp của chính bạn (atoi & atof), thường tăng tốc độ ít nhất hai lần, so với phương pháp đọc "phổ quát".

0

Something nhanh chóng và dơ bẩn là chỉ cần đổ các tập tin vào một C++ chuỗi tiêu chuẩn, và sau đó sử dụng một stringstream vào nó:

#include <sstream> 
// Load file into string file_string 
std::stringstream s(file_string); 
int x; float y; 
s >> x >> y; 

này có thể không cung cấp cho bạn nhiều sự cải thiện hiệu suất (bạn sẽ nhận được một tăng tốc độ lớn hơn bằng cách tránh iostream), nhưng nó rất dễ dàng để thử, và nó có thể đủ nhanh hơn.

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