2015-03-30 4 views
-1

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

Вопросы, которые у меня есть такие, как залежи:

  1. скопировать ли выше код в буфер stringstream или они обмена и тот же буфер? (Я не совсем уверен, что делает pubsetbuf или насколько он эффективен)
  2. Есть ли лучший способ сделать это вместо использования stringstream?
  3. Когда мы знаем длину некоторой относящейся к делу информации, т.е. «относящейся к делу информации, важной информации», и мы хотим, чтобы получить важную информацию, мы могли бы сделать что-то вроде этого:

    std::string container; 
    parser.seekg(irrelevant_size, parser.cur); // irrelevant_size is the size 
                  // of irrelevant data 
    std::getline(parser, container); 
    
  4. Насколько эффективна это по сравнению с делать

    parser.get(temp_char_array, irrelevant_size + 1);

    собрать все ненужные данные?

+0

Избавьтесь от поиска и скажите и используйте 'fstat()', чтобы получить размер файла, а не то, что вам действительно нужно. Вам лучше читать байты за один раз через буфер, чем читать весь файл, прежде чем обрабатывать его. – EJP

+0

Благодарим вас за ответ. У вас есть источник для последнего предложения, так как я прочитал, что быстрее положить полный файл в буфер? Объяснение этому заключалось в том, что медленнее читать из файла на диске, чем из ОЗУ. – hamzam

+0

@hamzam Если вы хотите прочитать весь файл несколько раз, лучше загружать все в ОЗУ вместо повторного ввода нескольких раз с HDD. Но 1: Если вы хотите пропустить нерелевантную часть, вам не нужен весь файл.Но 2: В зависимости от размера файла загрузка в ОЗУ плохая или вообще невозможная. – deviantfan

ответ

1

pubsetbuf не сделайте копию. См. Следующую ссылку для получения более подробной информации:
http://www.cplusplus.com/reference/streambuf/streambuf/pubsetbuf/

И поиск вперед в файле (намного) быстрее, чем чтение всего. Строго говоря, это не требуется, чтобы быть быстрее, но на всех обычных ОС это почти постоянное время (на самом деле, но не пропорционально длине поиска). Может быть, разница не настолько велика, если пропускаются только некоторые байты, но она становится более важной с большими расстояниями.

В зависимости от того, насколько важна небольшая скорость,
У вашей ОС есть несколько более быстрых (но зависимых от ОС) функций.
И если есть лучший способ синтаксического анализа, это зависит от ваших данных.
Вы должны задать это в отдельных вопросах.

+0

Благодарим вас за ответ. Чтобы заполнить все вопросы, я хотел бы спросить, есть ли лучший способ разбора файла вместо того, что я делаю - чтение полного файла, а затем использование stringstream? – hamzam

+0

@hamzam Вы даже читали? Это зависит от вашего контента, и вы должны задать его по другому вопросу с более подробной информацией. – deviantfan

+0

Я прочитал то, что вы написали, но я не поставил свой вопрос правильно. Я стремился к тому, чтобы получить комментарий к методу, который я выполняю, независимо от ОС и данных, или общий совет по эффективному анализу файлов (т. Е. Если есть способ, который превосходит то, что я делал в каждом аспекте, или если я следует избегать строк и т. д.). – hamzam

Смежные вопросы