javascript - Google BigQuery Python 库下载结果的速度是 Node JS 库的 2 倍

标签 javascript python google-bigquery

我一直在进行测试,以比较 Google BigQuery Python 客户端库与 Node JS 库下载查询结果的速度。看起来,开箱即用的 Python 库下载数据的速度大约是 Javascript Node JS 客户端的两倍。为什么会这样?

下面我提供了两个测试,一个用 Python,一个用 Javascript。 我选择了 BigQuery 的 usa_names 公共(public)数据集作为示例。此数据集中的 usa_1910_current 表大约有 600 万行,大小约为 180Mb。我有一个 200Mb 光纤下载链接(有关最后一英里的信息)。数据打包到 pandas dataframe 后约为 1.1Gb(包括 Pandas 开销)。

Python测试

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 测试

// 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();

180Mb数据的Python库测试结果:

  • 数据大小 Mb:1172.0694370269775 Mb
  • 数据框的形状:(6028151, 5)
  • 请求时间:3.58441424369812
  • 获取时间:388.0966112613678 <-- 这是6.46 分钟

180Mb数据的Node JS库测试结果:

  • 开始时间:2019-06-03 19:11:03
  • 结束:2019-06-03 19:24:12 <- 大约 13 分钟

为了进一步引用,我还针对 2Gb 表运行了测试...

2Gb 数据的 Python 库测试结果:

  • 数据大小 Mb:3397.0339670181274 Mb
  • 数据框的形状:(1278004, 21)
  • 请求时间:2.4991791248321533
  • 获取时间:867.7270500659943 <-- 这是14.45分钟

2Gb 数据的 Node JS 库测试结果:

  • 开始时间:2019-06-03 15:30:59
  • 结束:2019-06-03 16:02:49 <-- 差值刚好低于31 分钟

最佳答案

正如我所见,Node JS 使用 pagination管理数据集,而 Python 看起来像是带来了整个数据集并开始使用它。

这可能会影响 Node JS 客户端库的性能,我的建议是查看两个客户端的源代码并不断阅读谷歌云博客,谷歌有时会在其中发布使用其产品的技巧和最佳实践,例如本文:Testing Cloud Pub/Sub clients to maximize streaming performance.

关于javascript - Google BigQuery Python 库下载结果的速度是 Node JS 库的 2 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433464/

相关文章:

javascript - Angular2 从后端服务中的数组更新 View

python - 计算 Pandas 数据框中的重复元素

Python/SQLite3 raise 函数错误

python - 如何创建用于回归的神经网络?

google-bigquery - BigQuery 减去两个表的计数?

sql - 如何在标准 SQL 中将纪元时间戳转换为日期

google-bigquery - 我可以估算 BigQuery 运行导出作业所花费的时间吗?

javascript - 如何在semantic-ui api中显示结果

javascript - Anuglar2 - 错误找不到模块

javascript - Backbone model.save() 以一种奇怪的方式将属性发送到服务器