2010-08-03 9 views
5

Cách tốt nhất để phân tích một tệp điểm nổi lớn được lưu trữ trong ASCII là gì?Cách tốt nhất để phân tích cú pháp một tệp điểm nổi lớn được lưu trữ trong ASCII?

Cách nhanh nhất để làm điều đó là gì? Tôi nhớ ai đó nói với tôi bằng cách sử dụng ifstream là xấu, bởi vì nó làm việc trên một số lượng nhỏ byte, và nó sẽ là tốt hơn để chỉ cần đọc các tập tin vào bộ nhớ đầu tiên. Điều đó có đúng không?

Chỉnh sửa: Tôi đang chạy trên Windows và định dạng tệp là dành cho đám mây điểm được lưu trữ trong các hàng như x y z r g b. Tôi đang cố đọc chúng thành mảng. Ngoài ra, các tệp có khoảng 20   MB mỗi tệp, nhưng tôi có khoảng 10   GB giá trị của chúng.

Chỉnh sửa lần thứ hai: Tôi sẽ phải tải các tệp để hiển thị mỗi khi tôi muốn thực hiện trực quan hóa, vì vậy sẽ tốt hơn nếu có nó nhanh nhất có thể, nhưng trung thực, nếu ifstream preforms hợp lý, tôi sẽ 't tâm gắn bó với mã có thể đọc được. Nó đang chạy khá chậm ngay bây giờ, nhưng đó có thể là nhiều hơn một phần cứng I/O giới hạn hơn bất cứ điều gì tôi có thể làm trong phần mềm, tôi chỉ muốn xác nhận.

+0

Bạn có nghĩa là một tệp lớn có nhiều số dấu chấm động không? –

+0

"Tốt nhất" không phải lúc nào cũng có nghĩa là "nhanh nhất". – strager

+1

Tệp lớn như thế nào? Bạn đã có một thói quen tại chỗ không đủ nhanh? –

Trả lời

4

Tôi nghĩ rằng mối quan tâm đầu tiên của bạn phải là số lượng dấu phẩy động lớn như thế nào. Chúng có nổi hay có thể có dữ liệu kép không? Cách truyền thống (C) sẽ được sử dụng fscanf với định dạng specifier cho một float và afaik nó là khá nhanh. Các iostreams làm thêm một chi phí nhỏ trong phân tích dữ liệu, nhưng điều đó là khá không đáng kể. Vì lợi ích của ngắn gọn tôi sẽ đề nghị bạn sử dụng iostreams (chưa kể đến các tính năng dòng thông thường mà bạn muốn có được với nó).

Ngoài ra, tôi nghĩ rằng nó thực sự sẽ giúp cộng đồng nếu bạn có thể thêm các số có liên quan cùng với câu hỏi của bạn, ví dụ: một tệp lớn bạn đang cố gắng phân tích cú pháp? Đây có phải là một môi trường bộ nhớ nhỏ (như một hệ thống nhúng).

0

Cách nhanh nhất có thể là sử dụng ifstream, nhưng bạn cũng có thể sử dụng fscanf. Nếu bạn có một nền tảng cụ thể, bạn có thể tự tay tải tệp vào bộ nhớ và phân tích cú pháp từ nó theo cách thủ công.

1

Tất cả đều dựa trên hệ điều hành và lựa chọn thư viện chuẩn C và C++.

Những ngày chậm ifstream là khá nhiều hơn, tuy nhiên, có khả năng một số chi phí trong việc xử lý C + + chung giao diện.

atof/strtod có thể là cách nhanh nhất để xử lý nếu chuỗi đã có trong bộ nhớ.

Cuối cùng, mọi nỗ lực bạn thực hiện khi nhận tệp được đọc vào bộ nhớ có thể sẽ vô ích. Các hệ điều hành hiện đại thường bị cản trở (đặc biệt nếu tệp lớn hơn RAM, bạn sẽ kết thúc việc trao đổi mã vì hệ thống sẽ xử lý dữ liệu (đã được lưu trữ trên đĩa) của bạn dưới dạng có thể hoán đổi).

Nếu bạn thực sự cần phải lố bịch một cách nhanh chóng (Chỉ những nơi tôi có thể nghĩ là hữu ích là phương pháp tiếp cận dựa trên HPC và Map/Reduce) - hãy thử mmap (Linux/Unix) hoặc MapViewOfFile để lấy tệp được tìm nạp trước vào bộ nhớ ảo trong cách tiếp cận hợp lý nhất, và sau đó atof + xử lý chuỗi tùy chỉnh.

Nếu tệp được tổ chức thực sự tốt cho loại trò chơi này, bạn thậm chí có thể kỳ quặc với mmaps và con trỏ và có chuyển đổi đa luồng. Âm thanh như một bài tập thú vị nếu bạn có hơn 10 GB phao nổi để chuyển đổi một cách thường xuyên.