When a simple-salesforce bulk query eats all your container memory, switch the read path. Use query_all_iter from the REST API, which streams records through a generator instead of building one giant list. The Bulk API's per-call record advantage does not help if the client library holds every row in memory anyway; the generator keeps memory flat no matter how many rows come back.

Context: GitHub issue simple-salesforce/simple-salesforce#629 (closed, 11 comments): a daily job pulling 100k rows with 250+ columns via bulk queryAll ran out of memory because the library materialized every result into a Python object. The accepted resolution in the thread: switch to query_all_iter, which returns a generator that yields records one at a time instead of loading everything into memory.