В настоящее время я делаю проект, где мне нужно прочитать несколько больших файлов. Я хотел бы спросить о некоторых из лучших практик для оптимизации синтаксического анализа файлов на C++.Быстрый анализ файлов C++
После прочтения некоторых тестов (example) относительно fread, ifstream и т. Д. Я решил использовать ifstream для этой цели (если вы считаете, что есть лучший способ, пожалуйста, укажите любые улучшения). То, как я использовал его до сих пор было так:
std::ifstream input_file ("some_file.txt");
input_file.seekg (0, input_file.end);
int length = input_file.tellg(); // Get the size of the buffer
input_file.seekg (0, input_file.beg);
std::vector<char> buffer (length);
input_file.read(&buffer[0], length);
Тогда я хотел бы использовать stringstream для разбора файла, как это:
std::stringstream parser;
parser.rdbuf()->pubsetbuf(&buffer[0], length);
и продолжить разбор с stringstream анализатором.
Вопросы, которые у меня есть такие, как залежи:
- скопировать ли выше код в буфер stringstream или они обмена и тот же буфер? (Я не совсем уверен, что делает pubsetbuf или насколько он эффективен)
- Есть ли лучший способ сделать это вместо использования stringstream?
Когда мы знаем длину некоторой относящейся к делу информации, т.е. «относящейся к делу информации, важной информации», и мы хотим, чтобы получить важную информацию, мы могли бы сделать что-то вроде этого:
std::string container; parser.seekg(irrelevant_size, parser.cur); // irrelevant_size is the size // of irrelevant data std::getline(parser, container);
Насколько эффективна это по сравнению с делать
parser.get(temp_char_array, irrelevant_size + 1);
собрать все ненужные данные?
Избавьтесь от поиска и скажите и используйте 'fstat()', чтобы получить размер файла, а не то, что вам действительно нужно. Вам лучше читать байты за один раз через буфер, чем читать весь файл, прежде чем обрабатывать его. – EJP
Благодарим вас за ответ. У вас есть источник для последнего предложения, так как я прочитал, что быстрее положить полный файл в буфер? Объяснение этому заключалось в том, что медленнее читать из файла на диске, чем из ОЗУ. – hamzam
@hamzam Если вы хотите прочитать весь файл несколько раз, лучше загружать все в ОЗУ вместо повторного ввода нескольких раз с HDD. Но 1: Если вы хотите пропустить нерелевантную часть, вам не нужен весь файл.Но 2: В зависимости от размера файла загрузка в ОЗУ плохая или вообще невозможная. – deviantfan