我正在尝试使用python从大查询中获取数据。该代码在我的笔记本电脑上运行良好,但在Linux服务器上引发了内存错误。是否可以对其进行优化,使其也可以在服务器上运行?
错误:表有500万行... Linux计算机具有8 GB内存。...错误“内存不足”,进程被杀死
下面是代码:
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()
答案 0 :(得分:0)
我可以建议两种方法:
选项1
SELECT
以块为单位的数据,以减少每次迭代从BigQuery接收到的数据的大小。
例如,您的表是分区,您可以执行以下操作:
WHERE _PARTITIONTIME = currentLoopDate
其中currentLoopDate将是您的python代码中的日期变量(类似的选择是使用ROW_NUMBER
选项2
通过使用BigQuery client library,您可以使用 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)
有关更多详细信息,请参见此link
在获得jobId之后,使用Jobs.getQueryResults编写一个循环,通过设置API的maxResults
参数来获取数据块