Библиотека Google BigQuery Python в 2 раза быстрее библиотеки Node JS для загрузки результатов - PullRequest
4 голосов
/ 03 июня 2019

Я проводил тест, чтобы сравнить скорости, с которыми клиентская библиотека Google BigQuery Python загружает результаты запросов, по сравнению с библиотекой Node JS. Казалось бы, из коробки библиотеки Python загружают данные примерно в раза в два раза быстрее , чем JS-клиент Javascript Node. Почему это так?

Ниже я приведу два теста, один на Python и один на Javascript. Я выбрал usa_names публичный набор данных BigQuery в качестве примера. Таблица usa_1910_current в этом наборе данных имеет размер около 6 миллионов строк и размер 180Mb. У меня есть ссылка на загрузку волокна 200 Мб (для информации о последней миле). Данные, упакованные в кадр данных Pandas, составляют около 1,1 ГБ (с учетом накладных расходов Pandas).

Python test

from google.cloud import bigquery
import time
import pandas as pd

bq_client = bigquery.Client("mydata-1470162410749")

sql = """SELECT * FROM `bigquery-public-data.usa_names.usa_1910_current`"""

job_config = bigquery.QueryJobConfig()

start = time.time()
#---------------------------------------------------
query_job = bq_client.query(
    sql,
    location='US',
    job_config=job_config)  
#--------------------------------------------------- 
end = time.time()
query_time = end-start

start = time.time()
#---------------------------------------------------
rows = list(query_job.result(timeout=30))
df = pd.DataFrame(data=[list(x.values()) for x in rows], columns=list(rows[0].keys()))
#---------------------------------------------------    
end = time.time()

iteration_time = end-start
dataframe_size_mb = df.memory_usage(deep=True).sum() / 1024 ** 2
print("Size of the data in Mb: " + str(dataframe_size_mb) + " Mb")
print("Shape of the dataframe: " + str(df.shape))
print("Request time:", query_time)
print("Fetch time:", iteration_time)

Узел JS test

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const moment = require('moment')

async function query() {

  const bigqueryClient = new BigQuery();
  const query = "SELECT * FROM `bigquery-public-data.usa_names.usa_1910_current`";
  const options = {
    query: query,
    location: 'US',
  };

  // Run the query as a job
  const [job] = await bigqueryClient.createQueryJob(options);
  console.log(`Job ${job.id} started.`);

  // Wait for the query to finish
  let startTime = moment.utc()
  console.log('Start: ', startTime.format("YYYY-MM-DD HH:mm:ss"));
  const [rows] = await job.getQueryResults();
  let endTime = moment.utc()
  console.log('End: ', endTime.format("YYYY-MM-DD HH:mm:ss"));
  console.log('Difference (s): ', endTime.diff(startTime) / 1000)
}

query();

Результаты тестирования библиотеки Python с 180 МБ данных:

  • Размер данных в Мб: 1172.0694370269775 Мб
  • Форма кадра данных: (6028151, 5)
  • Время запроса: 3.58441424369812
  • Время выборки: 388.0966112613678 <- Это <strong>6,46 мин

Результаты тестирования JS-библиотеки узла с 180 МБ данных:

  • Начало: 2019-06-03 19: 11: 03
  • Конец: 2019-06-03 19:24:12 <- Около <strong>13 минут

Для дальнейшего ознакомления я также провел тесты с таблицей 2 Гб ...

Результаты теста библиотеки Python с 2 ГБ данных:

  • Размер данных в Мб: 3397.0339670181274 Мб
  • Форма кадра данных: (1278004, 21)
  • Время запроса: 2.4991791248321533
  • Время выборки: 867.7270500659943 <- Это <strong>14.45мин

Результаты тестирования библиотеки JS узла с 2 ГБ данных:

  • Начало: 2019-06-03 15: 30: 59
  • Конец: 2019-06-03 16:02:49 <- Разница чуть ниже <strong>31 минута
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...