В настоящее время я работаю над проектом, где у меня есть большой текстовый файл (15+ ГБ), и я пытаюсь запустить функцию в каждой строке файла. Чтобы ускорить выполнение задачи, я создаю 4 потока и пытаюсь заставить их прочитать файл в одно и то же время. Это похоже на то, что у меня есть:Есть ли способ атомного чтения строки из файла 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;
}
Функция GetLine (наряду с «* словник >> слово»), кажется, увеличиваем указатель и прочитать значение в 2 этапа, как я буду регулярно получать:
Item1 Item2 Item3 Item2
назад.
Так что мне было интересно, есть ли способ атомно прочитать строку файла? Загрузка его в массив сначала не будет работать, потому что файл слишком большой, и я бы предпочел не загружать файл в куски за раз.
Я не мог найти ничего о fstream и атомарности getline. Если есть атомная версия readline или даже простой способ использовать блокировки для достижения того, что я хочу, я все уши.
Заранее благодарен!
Есть ли каждая линия того же размера? Если нет, то нет, вы не можете сделать это без некоторой синхронизации (например, семафоров или мьютексов). –
Я не могу поверить, что это невозможно. Даже с помощью 'read' syscalls. Однако это неправильный способ сделать это: вы должны дать вашим потокам линию для обработки; то у вас нет общего ресурса. –
Коэффициенты высоки, что одновременное чтение в тот же файл очень сильно замедлит работу. Существует один диск для чтения, и вы хотите выполнять очень мелкозернистые обращения в разных местах с синхронизацией. –