Почему это - больше памяти, эффективной для чтения входа как потока по сравнению со строкой?

Значение желания быть равным b, так как оператор запятой имеет более низкий приоритет, чем оператор присваивания.

7
задан Marcus Leon 10 December 2009 в 00:51
поделиться

4 ответа

Я только что пробовал. Исключение проходит. Если вы запустите следующий код:

#include <new>

class Foo
{
public:
    Foo()
    {
        throw 42;
    }
};


int main()
{
    Foo* foo = new(std::nothrow) Foo;

    return 0;
}

, то получите следующий результат (во всяком случае, в Linux):

terminate called after throwing an instance of 'int'
Aborted

Итак, исключение действительно проходит, несмотря на то, что нет.

то на самом деле вы обрабатываете N байтов за раз. Это означает, что вы можете начать обработку первого сегмента ответа, пока удаленный сервер все еще отправляет обратно следующий сегмент данных. Следовательно, это имеет больше смысла как метод доступа , если ваш вариант использования позволяет обрабатывать данные по мере их получения.

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

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

13
ответ дан 6 December 2019 в 10:00
поделиться

Весь процесс не более эффективно использует память. Если вы читаете из потока и помещаете его в строку, вы просто разделяете процесс на две части, чтобы класс HttpClient этого не заметил.

Если вам действительно нужна вся строка, вы можете проигнорировать предупреждение. Затем вы должны убедиться, что он не использует слишком много памяти для каждого запроса, чтобы сервер не мог быть легко сброшен из-за DoS-атаки.

4
ответ дан 6 December 2019 в 10:00
поделиться

ваш вопрос сбивает с толку

, если вам АБСОЛЮТНО нужен весь ответ в виде строки, тогда сделайте это,

но если вам это вообще может сойти с рук, используйте потоки.

когда вы загружаете весь ответ в строку, все тело ответа одновременно присутствует в памяти.

при использовании потоков только небольшая часть ответа сохраняется в памяти одновременно.

в документации говорится, что, особенно при одновременном использовании нескольких больших запросов, загрузка всего тела запроса в строку потребует много памяти.

2
ответ дан 6 December 2019 в 10:00
поделиться

Если вы выполняете синтаксический анализ в org.w3c.Document (или еще лучше, в org.jdom.Document ), это действительно просто чтобы напрямую использовать поток. Пример:

org.apache.http.HttpResponse hr = httpClient.execute(httpRequest);
org.apache.http.HttpEntity he = hr.getEntity();
org.jdom.input.SAXBuilder builder = new SAXBuilder();
org.jdom.Document document = builder.build(he.getContent());
0
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: