Я проводил тест, чтобы сравнить скорости, с которыми клиентская библиотека 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 минута