Tôi có một tệp văn bản rất lớn (+ 10GB) mà tôi muốn đọc cho một số kỹ thuật khai thác dữ liệu. Để làm điều đó, tôi sử dụng kỹ thuật song song với MPI vì vậy nhiều quá trình có thể truy cập cùng nhau vào cùng một tệp.
Thực tế, tôi muốn mỗi quá trình đọc N số dòng. Vì tệp không được cấu trúc (cùng số trường nhưng mỗi trường có thể chứa số ký tự khác nhau), tôi có nghĩa vụ phân tích cú pháp tệp và điều đó không song song và phải mất rất nhiều thời gian. Có cách nào để truy cập trực tiếp vào một số dòng cụ thể với tính năng phân tích cú pháp và đếm các dòng không? Cảm ơn sự giúp đỡ của bạn.Cách truy cập trực tiếp và hiệu quả vào tệp văn bản rất lớn?
Trả lời
Nếu tệp của bạn không được lập chỉ mục khác, không có cách nào trực tiếp.
Lập chỉ mục có thể đáng giá (quét tìm một lần để tìm tất cả các kết thúc dòng và lưu trữ bù của mỗi dòng hoặc đoạn đường). Nếu bạn cần xử lý tệp nhiều lần và không thay đổi, chi phí lập chỉ mục có thể được bù đắp bằng cách sử dụng chỉ mục để chạy tiếp.
Nếu không, nếu bạn không cần tất cả các công việc để có chính xác cùng một số dòng/mục, bạn chỉ có thể giả mạo nó.
Tìm kiếm một giá trị đã cho (ví dụ 1G) và tìm dấu tách dòng gần nhất. Lặp lại tại offset 2G, vv cho đến khi bạn đã tìm thấy đủ điểm break.
Sau đó, bạn có thể kích hoạt các tác vụ song song của mình trên từng khối bạn đã xác định.
Không có không: cho đến khi bạn không đọc qua dữ liệu không xác định của bạn, không ai biết có bao nhiêu ký tự dòng mới. Độ phức tạp của vấn đề này là O (n) do đó có nghĩa là ít nhất một lần là bạn sẽ phải đọc toàn bộ tệp. Sau đó, bạn có thể muốn xây dựng một bảng chỉ mục nơi bạn ghi lại nơi có các ký tự dòng mới trong tệp của bạn: điều này có thể được sử dụng bởi tất cả quy trình và với fseek bạn có thể tăng tốc truy cập đáng kể hơn nữa.
cảm ơn bạn đã trả lời, có vẻ như là một giải pháp tốt. Tôi sẽ làm điều đó và xem nếu nó có giá trị kể từ trong chế độ nối tiếp, tôi đọc một tập tin, sau đó cho mỗi dòng tôi làm nhiều tính toán CPU. Cho đến nay tôi có hai giải pháp: tôi phân tích cú pháp tập tin để xây dựng một tập tin chỉ mục sau đó tất cả các quá trình có thể sử dụng nó. Hoặc tôi làm cho một quá trình đọc từ tập tin và làm cho các quá trình khác làm tính toán. – ezzakrem
Với O (n) tôi đã gọi ký hiệu này: http://en.wikipedia.org/wiki/Time_complexity#Linear_time Bằng cách này, việc lập chỉ mục rất dễ thực hiện song song. Nếu bạn có nhiều quy trình, bạn có thể chia nhỏ tệp _also để lập chỉ mục_, vì vậy, hãy nói quy trình thứ nhất đọc qua Gb đầu tiên, thứ 2, v.v ... và lưu tất cả các vị trí của các ký tự dòng mới vào cùng một tài nguyên được chia sẻ . Điều này cũng có thể tăng tốc độ lập chỉ mục. Tuy nhiên, đừng quên rằng tùy thuộc vào phần cứng lưu trữ bạn sử dụng, việc đọc tuần tự có thể nhanh hơn MUCH. – MrTJ
do đó, về việc trộn hai bước 1- làm cho các quy trình N nhận chỉ mục như bạn đã nói. 2- đối với tính toán cpu, mỗi quá trình truy cập trực tiếp với fseek() để bù trừ cụ thể. Điều đó có vẻ tốt đẹp để thử. Cảm ơn bạn – ezzakrem
Một vài lựa chọn khác ngoài những gì đã được đề cập ở đây rằng sẽ không yêu cầu quét toàn bộ file:
làm cho một quá trình tổng thể đẩy dòng qua ống/FIFOs để tiến trình con mà làm việc xử lý thực tế. Điều này có thể là một chút chậm hơn nhưng nếu nói 90% thời gian dành cho các quy trình con là việc crunching văn bản thực tế, nó sẽ ổn.
Bí quyết ngu ngốc nhưng hiệu quả: giả sử bạn có N quy trình và bạn có thể nói với từng quá trình bằng argv hoặc một số "số sê-ri", ví dụ:
processor -serial_number [1|2|3...N] -num_procs N
, tất cả chúng đều có thể đọc cùng một dữ liệu nhưng chỉ xử lý các dòng cólineno % num_procs == serial_number
. nó kém hiệu quả hơn một chút bởi vì tất cả chúng sẽ đọc toàn bộ dữ liệu, nhưng một lần nữa, nếu chúng chỉ hoạt động trên mọi dòng Nth, và đó là những gì tiêu thụ phần lớn thời gian, bạn sẽ ổn thôi.
+1 cho tư duy thay thế. Đôi khi cách tốt nhất để giành chiến thắng, là thay đổi các quy tắc. –
- 1. Cách xử lý tệp văn bản rất lớn?
- 2. Làm thế nào để ghi một tệp văn bản lớn vào C# một cách hiệu quả?
- 3. Truy cập trực tiếp vào TableLayoutPanel Cells
- 4. Cách hiệu quả nhất để xuất dữ liệu lớn (3.9 mill obs) thành tệp văn bản?
- 5. Cách phân tích cú pháp hiệu quả các tệp văn bản lớn trong Ruby
- 6. Cách viết văn bản hiệu quả vào một tệp văn bản trong VB.NET
- 7. cách hiệu quả để viết rất nhiều dòng vào một tập tin văn bản
- 8. Vẽ một hàm trực tiếp từ một tệp văn bản
- 9. Cách định cấu hình truy cập http trực tiếp vào phiên bản EC2?
- 10. Trình xem nhật ký trực tiếp hiệu quả trong WPF
- 11. Phân tích cú pháp một tệp văn bản lớn hiệu quả trong C#
- 12. Hiệu quả nhân các ma trận rất lớn trong MATLAB
- 13. Ngăn chặn truy cập trực tiếp vào trang PHP
- 14. Từ chối truy cập trực tiếp vào các trang jsp
- 15. Apache RewriteMap được sử dụng để ngăn truy cập trực tiếp vào các tệp
- 16. Truy cập bằng muti-ren vào cùng một tệp văn bản
- 17. Giảm hiệu năng rất lớn khi truy cập đối tượng trong mảng PHP
- 18. HPET có thể truy cập trực tiếp trong Windows không?
- 19. Truy cập MongoDB trực tiếp qua JavaScript
- 20. Cách hiệu quả để truy cập các tập dữ liệu lớn để hiển thị trên Leaflet
- 21. Chặn truy cập kịch bản trực tiếp vào một tập tin
- 22. Xử lý dòng tệp văn bản rất lớn (> 20GB) theo dòng
- 23. Đọc một tệp văn bản lớn vào Textview
- 24. Bảo vệ file PHP từ truy cập trực tiếp
- 25. Truy cập các tệp lớn trong C
- 26. Cách chia nhỏ các tệp lớn hiệu quả
- 27. Cách truy cập văn bản mô tả trong rspec
- 28. Cách hiệu quả để hợp nhất 2 tệp CSS lớn
- 29. C# - Đọc trong một tệp văn bản lớn (150MB) vào Hộp văn bản có dạng thức
- 30. Đọc txt lớn hiệu quả trong C++
Cảm ơn bạn đã trả lời. tôi nghĩ rằng ý tưởng thứ hai là tốt hơn vì tôi thường phân tích cú pháp tệp đúng lúc. Vì vậy, xem xét soluion này, tôi sẽ làm cho mỗi quá trình truy cập từ một bù đắp cụ thể cho phép nói (File_size/process_number * process_rank) sau đó tôi tìm sự bắt đầu của một dòng mới. Vì vậy, tôi sẽ lỏng lẻo ở dòng number_of_process tồi tệ hơn? – ezzakrem
+1 Quét một lần để tìm các ngắt dòng và chuyển các chỉ mục sang các quy trình khác hoàn toàn thích hợp hơn với bất kỳ điều gì khác, bởi vì bất kỳ tìm kiếm ngẫu nhiên nào cũng sẽ có nhiều đơn đặt hàng đắt hơn bất kỳ thứ gì bạn có thể mua từ việc phân tích cú pháp của một số trường trên mỗi dòng một tệp văn bản. Tuần tự đọc và kéo từ bộ nhớ cache đệm nhanh, mọi thứ khác đều đánh bại mọi tối ưu hóa. – Damon
@ezzakrem: nếu bạn có thể không đủ khả năng phân tích các dòng nhất định, tôi đoán bạn có thể làm điều đó. Nhưng tôi sẽ không. Trước khi bạn bắt đầu sinh ra công nhân, trong "chủ đề" chính của bạn, bạn sẽ tìm thấy tất cả các điểm vỡ mà bạn cần. Bạn bắt đầu/kết thúc offsets cho mỗi người lao động trước khi bạn bắt đầu. – Mat