Google AdWords API team shared best practices for downloading large data sets. Specifically, this post outline how to accomplish this using reports and why this's more efficient than paging with selectors.
"When you request a large amount of data using generic selectors (for e.g., keywords), you may find that the responses are slow for very large data sets. First, you're advised not to page past 10k records due to the increased amount of time it takes to skip the first 10,000 records. Second, once you exceed 100k keywords, it's a good to use a report to obtain your data rather than generic selectors," explains Google.
"Reports are designed to handle large quantities of data. In addition, you'll also use fewer API units if you request data via reports than if you request the same data via AdGroupCriterionService. Defining a report and downloading the data that way will cost significantly less units in the long run. If you define the report with a sliding date range such as TODAY or LAST_WEEK, you can reuse the report each time you need to download your data set."
Please see this page for more information about reports.
"If you need fields that're not available in reports, you've options to increase performance. With generic selectors you can specify only the fields you need; the fewer the number of requested fields, the faster the results will be returned. You can also use predicates to filter and limit the amount of data in each result set. By requesting keywords on a per-campaign or per-ad group basis instead of all at once, you may actually get your results faster," noted Google.
[Source: AdWords API blog]