Yeah, I see.
When reading the response as a ByteArray, String or other similar types, you ask Ktor to read it fully and provide it to you as a whole. This is usually ok, but in case you request some huge data, Ktor would try to allocate the memory for it and might fail.
On the other hand, you can use streaming when reading the response. This way you will have access to the data byte-by-byte, chunk-by-chunk. This is fine if you just want to store the data as a local file, or you can process your data in this streaming manner — e.g. if you use streaming decompression, or SAX parser for XML, or something similar. Ktor will allocate the small buffer, put new chunk of data, you process it, then Ktor fills the next chunk, and so on. This doesn't put as much memory requirements as the other way.