python - 使用python从bigquery获取数据时Linux服务器上的内存错误?
问题描述
我正在尝试使用 python 从大查询中获取数据。该代码在我的笔记本电脑上运行良好,但在 Linux 服务器上引发内存错误。是否可以对其进行优化,使其也可以在服务器上运行?
错误:表有 500 万行...具有 8 GB 内存的 Linux 机器...错误“内存不足”,进程被终止
下面是代码:
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/Users/Desktop/big_query_test/soy-serenity-89ed73.json"
client = bigquery.Client()
# Perform a query.
QUERY = “SELECT * FROM `soy-serenity-89ed73.events10`”
query_job = client.query(QUERY)
df = query_job.to_dataframe()
解决方案
我可以建议两种方法:
选项 1
SELECT
分块数据,以减少您在每次迭代中从 BigQuery 收到的数据的大小。例如,您的表是分区,您可以这样做:
WHERE _PARTITIONTIME = currentLoopDate
其中 currentLoopDate 将是您的 python 代码中的日期变量(类似的选项将使用ROW_NUMBER
选项 2
通过使用BigQuery 客户端库,您可以使用Jobs.insert API 并设置configuration.query.priority
为批处理。
# from google.cloud import bigquery
# client = bigquery.Client()
query = (
'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '
'WHERE state = "TX" '
'LIMIT 100')
query_job = client.query(
query,
# Location must match that of the dataset(s) referenced in the query.
location='US') # API request - starts the query
for row in query_job: # API request - fetches results
# Row values can be accessed by field name or index
assert row[0] == row.name == row['name']
print(row)
有关更多详细信息,请参阅此链接在获取 jobId 后,使用Jobs.getQueryResults编写一个循环,通过设置maxResults
API 的参数来获取数据块
推荐阅读
- vba - 如何在访问报告中生成列表?
- css - 是否可以在其父元素css中包含伪元素
- javascript - 纱线缓存清洁冻结并被杀死?
- apache-spark - Spark 作业停止。shuffle read 阶段总是有一个 executor 挂起,阻塞整个作业
- python - 用 BeautifulSoup 刮文本不起作用
- python - 重命名某个单元格两次但出现错误(ValueError: cannot reindex from a duplicate axis)
- javascript - Coingecko API currect_price 不返回 USDT 和其他一些代币
- android - 在 ashmem_create_region fd 上尝试 write() 时出现 EINVAL
- laravel-8 - Alpine.Js - 我如何升级
- load-balancing - 负载均衡器上的章鱼触手