Марков С ++ читал из файла производительность - PullRequest
0 голосов
/ 28 января 2010

У меня есть 2-е задание для класса C ++, который включает цепи Маркова Задание простое, но я не могу понять, как лучше всего выполнять чтение символов из файлов.

У меня есть файл около 300 КБ. Одним из правил назначения является использование классов Map и Vector. На карте (ключ только строка) и значениями будут векторы. Когда я читаю из файла, мне нужно начать собирать пары ключей.

Пример:

File1.txt
1234567890
1234567890

Если выбрать Марков k = 3, я должен иметь на своей карте:

key     vector
123  -> 4
456  -> 7
789  -> 0
0/n1 -> 2
234  -> 5
567  -> 8
890  -> /n
/n   -> NULL

Профессор предлагает читать символ за символом, поэтому мой алгоритм следующий

while (readchar != EOF){
tempstring += readchar
increment index
if index == Markovlevel {   
       get nextchar if =!EOF
       insert nextchar value in vector
       insert tempstring to Map and assign vector         
       unget char
}

}

Я опускаю некоторые другие детали. Мой главный вопрос заключается в том, что если у меня будет 318 000 символов, я буду выполнять условия каждый раз, что сильно замедляет работу компьютера (новый MAC pro). Пример программы от профессора исполняет этот файл примерно за 5 секунд.

Я не могу понять, как лучше всего читать слова фиксированной длины из текстового файла в C ++.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 28 января 2010

Повторное чтение файла замедлит работу программы.

Считать файл блоками, скажем, размером 1024, поместить в буфер. Затем обработайте этот буфер так, как вам требуется для назначения. Повторите для следующего блока, пока вы не закончили с файлом.

3 голосов
/ 28 января 2010

Вы действительно запланировали программу? 318 000 условных единиц должны стать частью вашего нового MAC Pro. Это должно занять только микросекунды.

Преждевременная оптимизация - корень всего зла. Сначала сделайте так, чтобы ваша программа работала, затем на втором месте оптимизация.

...