【发布时间】:2018-09-09 06:54:22
【问题描述】:
我正在 BigQuery 中运行一系列查询,并通过 PHP 将它们导出为 CSV。这对我来说是最简单的方法是有原因的(多个查询取决于应用程序中的变量)。
当结果集大于 100mb 时,我正在努力解决内存问题。看来我的代码的内存使用量似乎与结果集一致,我认为可以通过分页来避免这种情况。这是我的代码:
$query = $bq->query($myQuery);
$queryResults = $bq->runQuery($query,['maxResults'=>5000]);
$FH = fopen($storagepath, 'w');
$rows = $queryResults->rows();
foreach ($rows as $row) {
fputcsv($FH, $row);
}
fclose($FH);
$queryResults->rows() 函数返回一个谷歌迭代器,它使用分页来滚动结果,所以我不明白为什么脚本运行时内存使用量会增加。
当我翻阅结果时,我是否错过了一种从内存中丢弃先前页面的方法?
更新
我注意到,实际上自从升级到 v1.4.3 BigQuery PHP API 后,此进程的内存使用量确实达到了 120mb,即使结果集远远超出此值(当前处理 1gb 结果集)。但是,120mb 似乎太多了。如何识别并修复此内存的使用位置?
更新 2
这 120mb 似乎与页面中的每个 maxResult 绑定为 24kb。例如。将 1000 行添加到 maxResults 会增加 24mb 的内存。所以我现在的问题是为什么 Google 迭代器中的 1 行数据使用 24kb?有没有办法减少这种情况?数据本身每行
【问题讨论】:
-
为什么不将结果以 CSV 格式导出到 Cloud Storage,然后复制文件?
-
我看不到将查询直接导出到 CSV 的方法。我可以将结果保存到表中,然后导出表,但这需要我在运行查询时创建大量临时表,以及清理等。有没有办法将查询结果直接导出到 CSV?
-
运行查询总是会创建一个临时表,您可以将其导出。
-
请您指出如何执行此操作的方向吗?我在文档中找不到它。
-
cloud.google.com/bigquery/docs/exporting-data,另见cloud.google.com/bigquery/docs/reference/rest/v2/jobs 中的
configuration.query.destinationTable属性。它在运行查询后填充。
标签: php google-bigquery