Я работаю над каким-то проектом, и мне интересно, какой способ наиболее эффективно считывать огромное количество данных из файла (я говорю о файле длиной от 100 строк до 3 миллиардов строк, можно подумать ). После прочтения данные будут сохранены в структурированном наборе данных (vector<entry>
где «запись» определяет структурированную линию).
Структурированная строка этого файла может выглядеть так:
string int int int string string
который также заканчивается соответствующей платформой EOL
и является табуляцией
Что я хочу сделать, это:
string
) или же vector<char>
Мне нужно учитывать объем памяти и иметь высокую скорость анализа.
Я уже избегаю использования stringstream
поскольку они кажутся слишком медленными.
Я также избегаю многократных вызовов ввода / вывода для моего файла, используя:
// open the stream
std::ifstream is(filename);
// determine the file length
is.seekg(0, ios_base::end);
std::size_t size = is.tellg();
is.seekg(0, std::ios_base::beg);
// "out" can be a std::string or vector<char>
out.reserve(size / sizeof (char));
out.resize(size / sizeof (char), 0);
// load the data
is.read((char *) &out[0], size);
// close the file
is.close();
Я думал взять этот огромный std::string
и затем циклически перебирая строки, я извлекаю информацию о строках (строковые и целочисленные части) в строку набора данных. Есть ли лучший способ сделать это?
РЕДАКТИРОВАТЬ: Это приложение может работать на 32-битном, 64-битном компьютере или на суперкомпьютере для больших файлов.
Любые предложения очень приветствуются.
Спасибо
Несколько случайных мыслей:
в то время как я не могу говорить о суперкомпьютерах с 3-мя гигабайтами, вы никуда не уйдете в памяти на настольном компьютере.
Я думаю, что вы должны сначала попытаться выяснить все операции с этими данными. Вы должны попытаться разработать все алгоритмы для последовательной работы. если вам нужен произвольный доступ, вы будете постоянно менять местами. этот алгоритм будет иметь большое влияние на вашу модель данных.
поэтому не начинайте с чтения всех данных, просто потому, что это простая часть, а спроектируйте всю систему с четким представлением о том, какие данные находятся в памяти во время всей обработки.
Обновить
когда вы делаете всю обработку в одиночный забег в потоке и разделите обработку данных по этапам (чтение — предварительная обработка — … — запись), вы можете эффективно использовать многопоточность.
в конце концов
.
time
loop
read line from disk
time
loop
process line (counting words per line)
time
loop
write data (word count) from line to disk
time
против.
time
loop
read line from disk
process line (counting words per line)
write data (word count) from line to disk
time
если у вас уже есть алгоритмы, используйте ваши. в противном случае составьте одно (например, подсчет слов в строке). если этап записи не относится к вашей проблеме, пропустите его. этот тест займет у вас меньше часа, но вы можете сэкономить.