Медленное чтение файлов в Windows 7 - PullRequest
2 голосов
/ 24 октября 2010

Базовый вопрос c ++ здесь.Я пытаюсь прочитать большой файл на Windows 7 Pro.Компилятор C ++ - Visual Studio 2010. (версия 16.0).Я обнаружил, что программа работает примерно в 5 раз медленнее в Windows 7, чем на виртуальной машине с Ubuntu на том же компьютере.Ubuntu версии 10.04 с использованием gcc 4.4.3.Файл довольно большой ~ 900 МБ.Код, о котором идет речь, можно сузить до следующего фрагмента.Есть ли какие-то подсказки по настройке Windows для быстрого чтения файлов?Файл содержит около 17 миллионов строк и занимает около 13 секунд в Windows 7 и около 2,3 секунд в Ubuntu (это виртуальная машина в той же коробке Windows 7).Я использую флаги / O2 в Visual C ++ и -O3 в Ubuntu / gcc 4.4.3

Спасибо

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
    const char* test_file_path = argv[1];
    ifstream ifs(test_file_path);

    if (!ifs.is_open()) {
    cout << "Could not open " << test_file_path << endl;
    return 0;
    }

    unsigned long line_count = 1;
    unsigned long sum = 0;
    string line;
    // Go through all the lines in the file
    while (getline(ifs, line)) {
        line_count++;
    }
    cout << line_count << '\n';
    return 0;
}

Редактировать: Попытка увеличить размер отображаемого файла в памяти, предложенная Андерсом, и время упало до1,2 секундыПохоже, Ubuntu по умолчанию настроен на это, в то время как вы должны быть явными в Windows.Спасибо, Андерс.

Ответы [ 2 ]

3 голосов
/ 24 октября 2010

Если вы обеспокоены производительностью, я бы порекомендовал выйти из мира C ++ и заняться обработкой файлов API Win32 (например, файлы с отображением в памяти, для Boost есть библиотека для этого).

1 голос
/ 24 октября 2010

Обычно, если вы беспокоитесь о производительности, лучше использовать кеширование, а не системное. В зависимости от реализации getline(), это может быть очень медленно. Например, стандартная реализация fread() использует внутренний кэш объемом 4 КБ, поэтому будет много вызовов ввода-вывода. Поэтому, пожалуйста, реализуйте некоторое кэширование и используйте вашу реализацию getline().

Но в данном конкретном случае, я думаю, проблема в другом. При чтении со стандартного жесткого диска вы достигаете скорости 80-100 Мбит / с, и это дает около 10 секунд в лучшем случае для вашего конкретного файла. Логика обработки в вашем случае очень проста, поэтому жесткий диск будет узким местом. Есть две возможные причины этой разницы:

1) Кэширование файла Windows (первый тест в Windows поместил его в кеш, поэтому следующее чтение того же файла из ВМ было из системного кэша)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...