Самый быстрый и эффективный способ анализа необработанных данных из файла

Я работаю над каким-то проектом, и мне интересно, какой способ наиболее эффективно считывать огромное количество данных из файла (я говорю о файле длиной от 100 строк до 3 миллиардов строк, можно подумать ). После прочтения данные будут сохранены в структурированном наборе данных (vector<entry> где «запись» определяет структурированную линию).

Структурированная строка этого файла может выглядеть так:
string int int int string string
который также заканчивается соответствующей платформой EOL и является табуляцией

Что я хочу сделать, это:

  1. Считать файл в память (string) или же vector<char>
  2. Считайте необработанные данные из моего буфера и отформатируйте их в мой набор данных.

Мне нужно учитывать объем памяти и иметь высокую скорость анализа.
Я уже избегаю использования 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-битном компьютере или на суперкомпьютере для больших файлов.

Любые предложения очень приветствуются.

Спасибо

1

Решение

Несколько случайных мыслей:

  • Используйте vector :: resize () в начале (вы это сделали)
  • Одновременное чтение больших блоков файловых данных, по крайней мере, 4 КБ, лучше еще 256 КБ. Прочитайте их в буфер памяти, проанализируйте этот буфер в вашем векторе.
  • Не читайте весь файл сразу, это может привести к необходимости замены.
  • sizeof (char) всегда 1 🙂
0

Другие решения

в то время как я не могу говорить о суперкомпьютерах с 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

если у вас уже есть алгоритмы, используйте ваши. в противном случае составьте одно (например, подсчет слов в строке). если этап записи не относится к вашей проблеме, пропустите его. этот тест займет у вас меньше часа, но вы можете сэкономить.

0

По вопросам рекламы [email protected]