Title: Avoid running out of memory during slow iteration: set worker_queue maxsize to be 1, and/or make it configurable · Issue #561 · googleapis/python-bigquery · GitHub
Open Graph Title: Avoid running out of memory during slow iteration: set worker_queue maxsize to be 1, and/or make it configurable · Issue #561 · googleapis/python-bigquery
X Title: Avoid running out of memory during slow iteration: set worker_queue maxsize to be 1, and/or make it configurable · Issue #561 · googleapis/python-bigquery
Description: Is your feature request related to a problem? Please describe. When using to_dataframe_iterable for a large result set (with nested/repeated records) on a system with a fast upstream connection to BigQuery, but slow downstream processing...
Open Graph Description: Is your feature request related to a problem? Please describe. When using to_dataframe_iterable for a large result set (with nested/repeated records) on a system with a fast upstream connection to ...
X Description: Is your feature request related to a problem? Please describe. When using to_dataframe_iterable for a large result set (with nested/repeated records) on a system with a fast upstream connection to ...
Opengraph URL: https://github.com/googleapis/python-bigquery/issues/561
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Avoid running out of memory during slow iteration: set worker_queue maxsize to be 1, and/or make it configurable","articleBody":" **Is your feature request related to a problem? Please describe.**\r\n\r\nWhen using `to_dataframe_iterable` for a large result set (with nested/repeated records) on a system with a fast upstream connection to BigQuery, but _slow_ downstream processing, Python can use all the memory on the system, and get killed.\r\n\r\nI think I have tracked it down to the `worker_queue` that is used to pass data from the worker threads back to the main thread: it does not have a `maxsize`.\r\n\r\nhttps://github.com/googleapis/python-bigquery/blob/cc3394f80934419eb00c2029bb81c92a696e7d88/google/cloud/bigquery/_pandas_helpers.py#L657\r\n\r\nThis means that if items are not pulled from the queue fast enough, then all the memory on the system can be used\r\n\r\n **Describe the solution you'd like**\r\n\r\nI think a reasonable solution would be to set the `maxsize` to be 1:\r\n\r\n```python\r\nworker_queue = queue.Queue(maxsize=1)\r\n```\r\n\r\nThis would still effectively be a buffer size of \"number of threads + 1\" pages since each thread would fetch into a variable, and _then_ wait if the queue is full.\r\n\r\nHowever, it being configurable would also be reasonable I think.\r\n\r\n **Describe alternatives you've considered**\r\n\r\nI've monkey-patched for now, and it seems to work. But ideally, it wouldn't be necessary\r\n\r\n```python\r\n# ...\r\n\r\ndef _monkey_patch_queue_maxsize_1():\r\n OriginalQueue = queue.Queue\r\n\r\n class QueueWithMaxsize1(OriginalQueue):\r\n def __init__(self):\r\n super().__init__(maxsize=1)\r\n\r\n def _restore():\r\n queue.Queue = OriginalQueue\r\n\r\n queue.Queue = QueueWithMaxsize1\r\n\r\n return _restore\r\n\r\n# ....\r\n\r\nquery = bqClient.query(sql)\r\nresult_rows = query.result()\r\n\r\nensure_original_queue = _monkey_patch_queue_maxsize_1()\r\n\r\npages = result_rows.to_dataframe_iterable(bqStorageClient)\r\n\r\nfor page in pages:\r\n ensure_original_queue()\r\n # ... something slow, even time.sleep can do it\r\n```","author":{"url":"https://github.com/michalc","@type":"Person","name":"michalc"},"datePublished":"2021-03-19T08:10:46.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/561/python-bigquery/issues/561"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:98b52bdc-0735-2bce-f83b-da99ebb3a196 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 8B28:2086C7:1E17F54:295E581:6A4ECBB9 |
| html-safe-nonce | 062fe4f623a99d30d5d56d9845541c67d0ea8902780266ee163a4357c60e7302 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4QjI4OjIwODZDNzoxRTE3RjU0OjI5NUU1ODE6NkE0RUNCQjkiLCJ2aXNpdG9yX2lkIjoiNDE2MjgwOTQzMTgwMzc0MzE2MSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | fb7cdf1756977322ed81b3e7ed5327dbb0b1433c5733ec63e5c7a02f2d5c65c4 |
| hovercard-subject-tag | issue:835679649 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/googleapis/python-bigquery/561/issue_layout |
| twitter:image | https://opengraph.githubassets.com/68af742a62869e041a023fd3bc38c8d7ad2de707bf887feaa1154aa1c6f9180b/googleapis/python-bigquery/issues/561 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/68af742a62869e041a023fd3bc38c8d7ad2de707bf887feaa1154aa1c6f9180b/googleapis/python-bigquery/issues/561 |
| og:image:alt | Is your feature request related to a problem? Please describe. When using to_dataframe_iterable for a large result set (with nested/repeated records) on a system with a fast upstream connection to ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | michalc |
| hostname | github.com |
| expected-hostname | github.com |
| None | 41b6ab3ba6d20a71766ac245b5a4a94c6fc672a9cd4da7d44c1b33ab8bf6a21c |
| turbo-cache-control | no-preview |
| go-import | github.com/googleapis/python-bigquery git https://github.com/googleapis/python-bigquery.git |
| octolytics-dimension-user_id | 16785467 |
| octolytics-dimension-user_login | googleapis |
| octolytics-dimension-repository_id | 226992475 |
| octolytics-dimension-repository_nwo | googleapis/python-bigquery |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 226992475 |
| octolytics-dimension-repository_network_root_nwo | googleapis/python-bigquery |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | e6a744804e8e70f97b4d5a18a94dcc63db22f97a |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width