Ошибка памяти на сервере Linux при получении данных из больших запросов с использованием Python? - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь получить данные из большого запроса, используя Python. Код прекрасно работает на моем ноутбуке, но выдает ошибку памяти на сервере Linux. Можно ли оптимизировать его так, чтобы он мог работать и на сервере?

Ошибка: в таблице 5 миллионов строк ... Linux-машина с оперативной памятью 8 ГБ .... ошибка "недостаточно памяти", процесс остановлен

Ниже приведен код:

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 Ответ

0 голосов
/ 05 апреля 2019

Я могу предложить два подхода:

вариант 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...