How do I reduce scroll response time?

I have a query returning ~200K hits from 7 different indices distributed
across our cluster. I process my results as:

while (true) {
scrollResp =
client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new
TimeValue(600000)).execute().actionGet();
for (SearchHit hit : scrollResp.getHits()){
//process hit}

//Break condition: No hits are returned
if (scrollResp.hits().hits().length == 0) {
break;
}
}

I'm noticing that the client.prepareSearchScroll line can hang for quite
some time before returning the next set of search hits. This seems to get
worse the longer I run the code for.

My setup for the search is:

SearchRequestBuilder searchBuilder = client.prepareSearch( index_names )
.setSearchType(SearchType.SCAN)
.setScroll(new TimeValue(60000)) //TimeValue?
.setQuery( qb )
.setFrom(0) //?
.setSize(5000); //number of jsons to get in each search, what should it be?
I have no idea.
SearchResponse scrollResp = searchBuilder.execute().actionGet();

Is it expected that scanning and scrolling just takes a long time when
examining many results? I'm very new to Elastic Search so keep in mind that
I may be missing something very obvious.

Note: also posted at

--