Tôi hiện đang làm việc với một tệp văn bản lớn (15+ GB) và tôi đang cố gắng chạy một hàm trên mỗi dòng của tệp. Để tăng tốc nhiệm vụ, tôi tạo 4 chủ đề và cố gắng để họ đọc tập tin cùng một lúc. Điều này tương tự với những gì tôi có:Có cách nào để đọc nguyên tử một dòng từ một tệp C++
#include <stdio.h>
#include <string>
#include <iostream>
#include <stdlib.h>
#include <thread>
#include <fstream>
void simpleFunction(*wordlist){
string word;
getline(*wordlist, word);
cout << word << endl;
}
int main(){
int max_concurrant_threads = 4;
ifstream wordlist("filename.txt");
thread all_threads[max_concurrant_threads];
for(int i = 0; i < max_concurrant_threads; i++){
all_threads[i] = thread(simpleFunction,&wordlist);
}
for (int i = 0; i < max_concurrant_threads; ++i) {
all_threads[i].join();
}
return 0;
}
Chức năng getline (cùng với "* wordlist >> Từ") dường như để tăng con trỏ và đọc giá trị trong 2 bước, như tôi sẽ thường xuyên nhận được:
Item1 Item2 Item3 Item2
quay lại.
Vì vậy, tôi đã tự hỏi nếu có một cách để đọc nguyên tử một dòng của tập tin? Việc tải nó vào một mảng đầu tiên sẽ không hoạt động vì tệp quá lớn và tôi không muốn tải tệp theo từng phần tại một thời điểm.
Tôi không thể tìm thấy bất kỳ điều gì liên quan đến fstream và atomicity của getline đáng buồn. Nếu có một phiên bản nguyên tử của readline hoặc thậm chí là một cách đơn giản để sử dụng khóa để đạt được những gì tôi muốn, tôi là tất cả các tai.
Cảm ơn trước!
Mỗi dòng có cùng kích thước không? Nếu không thì không, bạn không thể thực sự làm điều đó mà không cần đồng bộ hóa (ví dụ: semaphores hoặc mutexes). –
Tôi không thể thực hiện điều đó bằng cách sử dụng khóa. Ngay cả chỉ với 'read' syscalls. Tuy nhiên, nó không phải là cách đúng để làm điều đó: Bạn nên cung cấp cho chủ đề của bạn một dòng để xử lý; thì bạn không có tài nguyên được chia sẻ. –
Tỷ lệ cược cao mà đồng thời đọc vào cùng một tệp sẽ làm chậm hoạt động rất nhiều. Có một đĩa đơn để đọc từ và bạn muốn thực hiện truy cập hạt rất tốt đến những nơi khác nhau, với đồng bộ hóa. –