Кодирование для ввода / вывода: скорость или приоритет памяти? - PullRequest
1 голос
/ 04 декабря 2011

В настоящее время я пишу простую часть анализа ввода-вывода, и у меня возникла дилемма относительно того, как мне ее кодировать.

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

Предположим, что размер файла превышает 2 МБ, а задержки аппаратного ввода-вывода составляют 5 мс для каждого вызова.

Первый случай: память

Первый случай - код дляпамять, но за счет скорости.Функция будет принимать небольшие части файла и разбирать их по частям, используя больше итераций, но меньше памяти.

Псевдокод:

function parser() {
    Open file and put into handle variable fHandle
    while (file position not passed EOF) {
        read 1024 bytes from file using fHandle into variable data
        process(data)
    }
    Close file using handle fHandle
}

Второй случай: Скорость

Второй случай - кодирование скорости за счет использования памяти.Функция загружает все содержимое файла в память и анализирует его напрямую.

Псевдокод:

function parser() {
    read entire file and store into variable data
    declare parsing position variable and set to 0
    while (parsing position not past data length) {
        get position of next token and store into variable pos
        process( substring from current position to pos of data )
    }
}

Примечание: при чтении всего файла мы используем функции прямого доступа к библиотеке для чтениявесь файл.Никакие циклы не используются при чтении файла на стороне разработчика.

Третий случай: выбор конечного пользователя

Тогда было бы целесообразно написать для обоих, и всякий раз, когда функция выполняется, функцияопределит, достаточно ли памяти или нет.Если в памяти много свободного места, функция будет использовать версию с интенсивным использованием памяти.

Псевдокод:

function parser() {
    if (memory is too little) {
        Open file and put into handle variable fHandle
        while (file position not passed EOF) {
            read 1024 bytes from file using fHandle into variable data
            process(data)
        }
        Close file using handle fHandle
    } else {
        read entire file and store into variable data
        declare parsing position variable and set to 0
        while (parsing position not past data length) {
            get position of next token and store into variable pos
            process( substring from current position to pos of data )
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 04 декабря 2011

Используйте асинхронный ввод-вывод (или второй поток) и обрабатывайте один фрагмент данных, пока накопитель занят извлечением следующего фрагмента. Лучшее из обоих миров.

0 голосов
/ 04 декабря 2011

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

0 голосов
/ 04 декабря 2011

Если вам необходимо прочитать полный файл в любом случае, и он без проблем помещается в память, считайте его из памяти.Будет ли это каждый раз один и тот же файл или какой-то небольшой набор файлов?Кешируйте их в памяти.

...