首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google BigQuery Python库是Node库下载结果速度的2倍。

Google BigQuery Python库是Node库下载结果速度的2倍。
EN

Stack Overflow用户
提问于 2019-06-03 19:29:26
回答 1查看 741关注 0票数 8

我一直在做一个测试,以比较库与Node库相比下载查询结果的速度。看起来,Python下载关于的数据的速度是Javascript客户机的两倍。为什么是这样?

下面我提供了两个测试,一个是Python测试,另一个是Javascript测试。我选择了usa_names的BigQuery公共数据集作为示例。此数据集中的usa_1910_current表约为600万行,大小约为180Mb。我有一个200 the的光纤下载链接(有关最后一英里的信息)。这些数据,在打包成熊猫的数据后,大约是1.1Gb (包括潘达斯的开销)。

Python测试

代码语言:javascript
复制
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测试

代码语言:javascript
复制
// 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();

拥有180 of数据的Python库测试结果:

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

拥有180 of数据的节点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数据的节点JS库测试结果:

  • 开始时间: 2019-06-03 15:30:59
  • 结束: 2019-06-03 16:02:49 <--差在31分钟以下
EN

回答 1

Stack Overflow用户

发布于 2019-08-05 19:27:20

正如我所看到的,Node使用分页来管理数据集,而Python看起来像它带来了整个数据集,并开始使用它。

这可能会影响Node客户端库的性能,我的建议是查看两个客户端的源代码,并不断阅读Google博客,其中谷歌有时发布使用其产品的提示和最佳实践,作为本文的一个示例:测试Cloud /Sub客户端以最大限度地提高流性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56433464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档